EXP_FIBO_ZZ





//+------------------------------------------------------------------+
//|                                               EXP_FIBO_ZZ_V0.mq4 |
//|                                   Copyright © 2009, Tokman Yuriy |
//|                                            yuriytokman@gmail.com |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, Tokman Yuriy"
#property link      "yuriytokman@gmail.com"

//1. Ðàññòàâëÿåì îòëîæåííûå ñòîï îðäåðà ïî óðîâíÿì 100 ïî ôèáî íà áàé è ñåëë + n(3,4,5) pips!
//2. Ðàñòàâëÿåì òîëüêî åñëè çèãçàã âíóòðè êàíàëà, ò.å. òðåòüÿ òî÷êà çèã çàãà äîëæíà áûòü 
//âíóòðè êàíàëà!ïðè ïðîáèòîì êîðèäîðå âûñòàâëÿòüñÿ íåëüçÿ!
//3. Ñòîïû ñòàâèë íà óðîâíå âíóòðè êàíàëà, ýòî ìîæåò áûòü 50, 38.2, èëè 61.8, âûáûðàåì ñàìè!
//4. Òàéê ïðîôèò ñòàâèì íà óðîâíå 161.8, èëè 200, òîæå ÷òîá ìîæíî áûëî âûáûðàòü ñàìîìó!
//5. Äîëæåí áûòü ðåíäæ êîðèäîðà,÷òîá ìîæíî áûëî âûáèðàòü ñàìîìó!  íàïðèìåð ìèíèìóì 20 ïóíêîâ,
// ìàêñèìóì 100 ïóíêòîâ!
//6. Åñëè ñðàáîòàë îäèí èç äâóõ îðäåðîâ âòîðîé àâòîìàòè÷åñêèé óäàëÿåòüñÿ!
//7. Âðåìÿ ðàáîòû, 00-24, èëè 8-16! ÷òî ìîæíî áûëî âûáèðàòü ïåðèîä âðåìåíè!
//8. íàñòðàèâàåìûé ëîò
//9. íàñòðîéêè ïàðàìåòðîâ çèãà çàãà ò.å. (12 6 3)
//10. Äîïîëíèòåëüíî, ÷òî ìîæíî áûëî ñäëåàòü ôóíêöèþ êîòîðîþ ìîæíî áóäåò âêë è âûêë, "ïðîöåíò 
//ðèñêà çà ñäåëêó íà ñäåëêó!"
//íàïðèìåð äåïîçèò â 1000 äîëëàðîâ, çàäàåì ïðîöåí ðèñê çà ñäåëêó äîïóñòè 5%, è â äàííûé ìîìåíò 
//ñòîï 50 ïóíêòîâ,
//òî òîãäà ëîò áóäåò 0.1, èëè ðèñê 10% ëîò òóò óæå 0.2, èëè ðàñòîÿíè ñòîïà 20 ïóíêòîâ è ðèñê 10%
// òî ëîò áóäåò 0.5!

extern string ____1___         = "Íàñòðîéêè èíäèêàòîðà ZigZag";
extern int    ExtDepth         = 12;
extern int    ExtDeviation     = 5;
extern int    ExtBackstep      = 3;

extern string ____2___         = "Âðåìÿ ðàáîòû ñîâåòíèêà";
extern int    StartHour        = 00;            // Ñòàðò ðàáîòû ÷àñû
extern int    StartMinute      = 01;            // Ñòàðò ðàáîòû ìèíóòû
extern int    StopHour         = 23;            // Ñòîï ðàáîòû ÷àñû
extern int    StopMinute       = 59;            // Ñòîï ðàáîòû ìèíóòû

extern string ____3___         = "Íàñòðîéêè êîðèäîðà è îòñòóïà";
extern int    n_pips           = 5;             // Îòñòóï â ïóíêòàõ
extern int    Min_Corridor     = 20;            // Ìèíèìàëüíûé ðàçìåð êîðèäîðà
extern int    Max_Corridor     = 100;           // Ìàêñèìàëüíûé ðàçìåð êîðèäîðà

extern string ____4___         = "Íàñòðîéêè ÌÌ";
extern bool   Choice_method    = true;          // Âûáîð ìåòîäà true - áàëàíññ , false - câîáîäíûå ñðåäñòâà
extern double Risk             = 1;             //% çàäà¸ì ïðîöåíò îò äåïîçèòà, åñëè 0 ðàáîòàåì ôèêñèðîâàíûì ëîòîì Lots
extern double Lots             = 0.1;           // Ðàçìåð ëîòà

extern bool   MovingInWL       = true;          // Ïåðåâîä â áåçóáûòîê
extern int    LevelProfit      = 13;            // Óðîâåíü ïðîôèòà â ïóíêòàõ, êîòîðîãî äîëæíà äîñòèãíóòü ïîçèöèÿ äëÿ òîãî, ÷òîáû å¸ ñòîï áûë ïåðåíåñ¸í íà óðîâåíü áåçóáûòêà.
extern int    LevelWLoss       = 2;             // Óðîâåíü áåçóáûòêà â ïóíêòàõ, íà êîòîðûé áóäåò ïåðåíåñ¸í ñòîï ïîçèöèè ïîñëå òîãî, êàê å¸ ïðîôèò äîñòèãíåò óðîâíÿ LevelProfit â ïóíêòàõ.


extern string _____5_____      = "Íàñòðîéêè ñîâåòíèêà";
extern double Fibo_StopLoss    = 61.8;          // Ðàçìåð ñòîïà â ïðîöåíòàõ
extern double Fibo_TakeProfit  = 161.8;         // Ðàçìåð òåéêà â ïðîöåíòàõ
extern int    MagicNumber      = 28081975;      // Ìàãè÷åñêîå ÷èñëî îðäåðîâ
extern int    Slippage         = 3;             // Ïðîñêàëüçûâàíèå öåíû
extern int    NumberOfTry      = 5;             // Êîëè÷åñòâî òîðãîâûõ ïîïûòîê

extern string _____6_____      = "Äðóãèå íàñòðîéêè";
extern bool   Line             = false;         // Ïîêàçûâàòü ëèíèè êàíàëà

extern bool   UseSound         = True;          // Èñïîëüçîâàòü çâóêîâîé ñèãíàë
extern string NameFileSound    = "expert.wav";  // Íàèìåíîâàíèå çâóêîâîãî ôàéëà
extern color  clDelete         = LightBlue;     // Öâåò çíà÷êà îòêðûòèÿ ïîêóïêè
extern color  clOpenBuy        = LightBlue;     // Öâåò çíà÷êà îòêðûòèÿ ïîêóïêè
extern color  clOpenSell       = LightCoral;    // Öâåò çíà÷êà îòêðûòèÿ ïðîäàæè
extern bool   ShowComment      = True;          // Ïîêàçûâàòü êîììåíòàðèé

//------- Ãëîáàëüíûå ïåðåìåííûå ñîâåòíèêà -------------------------------------+
int           NumberAccount    = 0;             // Íîìåð òîðãîâîãî ñ÷¸òà
bool          gbDisabled       = False;         // Ôëàã áëîêèðîâêè ñîâåòíèêà
bool          gbNoInit         = False;         // Ôëàã íåóäà÷íîé èíèöèàëèçàöèè
//------- Ïîäêëþ÷åíèå âíåøíèõ ìîäóëåé -----------------------------------------+
#include <stdlib.mqh>        // Ñòàíäàðòíàÿ áèáëèîòåêà ÌÒ4
string txt;
double current_high = 0, current_low = 0;
double          ppB = 0,         ppS = 0;
int    StopLoss     = 0;
int    TakeProfit   = 0;

string comment = "yuriytokman@gmail.com";
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
  gbNoInit=False;
  if (!IsTradeAllowed()) {
    Message("Äëÿ íîðìàëüíîé ðàáîòû ñîâåòíèêà íåîáõîäèìî\n"+
            "Ðàçðåøèòü ñîâåòíèêó òîðãîâàòü");
    gbNoInit=True; return;
  }
  if (!IsLibrariesAllowed()) {
    Message("Äëÿ íîðìàëüíîé ðàáîòû ñîâåòíèêà íåîáõîäèìî\n"+
            "Ðàçðåøèòü èìïîðò èç âíåøíèõ ýêñïåðòîâ");
    gbNoInit=True; return;
  }
  if (!IsTesting()) {
    if (IsExpertEnabled()) Message("Ñîâåòíèê áóäåò çàïóùåí ñëåäóþùèì òèêîì");
    else Message("Îòæàòà êíîïêà \"Ðàçðåøèòü çàïóñê ñîâåòíèêîâ\"");
  }
//----
  string char[256]; int i;
  for (i = 0; i < 256; i++) char[i] = CharToStr(i);
  txt =  
  char[121]+char[117]+char[114]+char[105]+char[121]+char[116]+char[111]
  +char[107]+char[109]+char[97]+char[110]+char[64]+char[103]+char[109]
  +char[97]+char[105]+char[108]+char[46]+char[99]+char[111]+char[109];
  
  Label("label",txt);

  comment = txt;   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
  if (!IsTesting()) Comment("");
  ObjectDelete("00");
  ObjectDelete("high");  
  ObjectDelete("low");   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
  if(MovingInWL) MovingInWL( NULL, -1, MagicNumber);  
//----
  if(!isTradeTimeInt(StartHour,StartMinute,StopHour,StopMinute))
    {
     Comment("Ñîâåòíèê îñòàíîâëåí! Ìîæíî ïîéòè ïîñïàòü èëè ñäåëàòü ïîëåçíîå äåëî.");
     return(-1);
    }
//----
  if (gbDisabled) {
    Message("Êðèòè÷åñêàÿ îøèáêà! Ñîâåòíèê ÎÑÒÀÍÎÂËÅÍ!"); return;
  }
  if (gbNoInit) {
    Message("Íå óäàëîñü èíèöèàëèçèðîâàòü ñîâåòíèê!"); return;
  }
  if (!IsTesting()) {
    if (NumberAccount>0 && NumberAccount!=AccountNumber()) {
      Comment("Òîðãîâëÿ íà ñ÷¸òå: "+AccountNumber()+" ÇÀÏÐÅÙÅÍÀ!");
      return;
    } else Comment("");}
//----
 double Lotsi;
 if(Risk<=0)Lotsi=Lots;
 else Lotsi=GetLot();  
//----
//----
   double high = 0, low = 0;
   
   double room_0 = GetExtremumZZPrice(NULL, 0, 0, ExtDepth, ExtDeviation, ExtBackstep);
   double room_1 = GetExtremumZZPrice(NULL, 0, 1, ExtDepth, ExtDeviation, ExtBackstep);
   double room_2 = GetExtremumZZPrice(NULL, 0, 2, ExtDepth, ExtDeviation, ExtBackstep);
   
   if(room_1>room_2){high = room_1; low = room_2;}//íàõîäèì âåðõ è íèç
   else {high = room_2; low = room_1;}            //íàõîäèì âåðõ è íèç 
   double size_corridor = high - low ;            //øèðèíà êîðèäîðà
   double STOPLEVEL = MarketInfo(Symbol(),MODE_STOPLEVEL)*Point;//Comment("STOPLEVEL=",STOPLEVEL);

//------âû÷èñëÿåì ÑÒ è ÒÏ
   StopLoss   = (size_corridor/100*Fibo_StopLoss)/Point;  
   TakeProfit = ((size_corridor/100*Fibo_TakeProfit)-size_corridor)/Point;
   ppB        = MathRound(high/Point + n_pips )*Point;     
   ppS        = MathRound(low/Point  - n_pips )*Point;
//------ïðîðèñîâêà ëèíèé äëÿ àíàëèçà
   if(Line){
   SetHLine(Yellow, "00", room_0, 0, 2);
   SetHLine(Lime, "high", high, 0, 2);
   SetHLine(Red, "low", low, 0, 2);}
   
//-----óäàëÿåì îòëîæêó åñëè åñòü ðûíî÷íûé îðäåð

   if(ExistPositions(NULL,-1,MagicNumber))//åñòü îòêðûòàÿ ïîçèöèÿ
   DeleteOrders(NULL, -1, MagicNumber);//óäàëÿåì îòëîæêè
   
//---------------------------------------------
 double sl=0, tp=0, ti=0;

   if(size_corridor>Min_Corridor*Point && size_corridor<Max_Corridor*Point  //êîðèäîð äîïóñòèìîé âåëè÷èíû
      && high>room_0+STOPLEVEL && low<room_0-STOPLEVEL)  //íóëåâàÿ òî÷êà çèãà íàõîäèòñÿ â êîðèäîðå   
   {
    if(!ExistPositions(NULL,-1,MagicNumber))//íåò îòêðûòûõ ïîçèöèé 
    {
     if(!ExistOrders(NULL,OP_BUYSTOP,MagicNumber))//íåò áàéñòîïà
      {
      if (StopLoss  >0) sl=ppB-StopLoss*Point;   else sl=0;
      if (TakeProfit>0) tp=ppB+TakeProfit*Point; else tp=0;     
      SetOrder(NULL,OP_BUYSTOP,Lotsi,ppB,sl,tp,MagicNumber,0,txt);//óñòàíàâëèâàåì áàé ñòîï
      }     
     else // åñòü áàéñòîï
      {
       if(GetOrderOpenPrice(NULL, OP_BUYSTOP, MagicNumber)!=ppB)
        {//ìîäèôèöèðóåì
         ti = TicketPos(NULL,OP_BUYSTOP,MagicNumber);
         if (OrderSelect(ti, SELECT_BY_TICKET))
          {
           if (StopLoss  >0) sl=ppB-StopLoss*Point;   else sl=0;
           if (TakeProfit>0) tp=ppB+TakeProfit*Point; else tp=0;
           ModifyOrder(ppB,sl,tp,Turquoise);
          }
        }       
      }
     
     if(!ExistOrders(NULL,OP_SELLSTOP,MagicNumber))//íåò ñåëëñòîïà     
      {
      if (StopLoss  >0) sl=ppS+StopLoss*Point;   else sl=0;
      if (TakeProfit>0) tp=ppS-TakeProfit*Point; else tp=0;     
      SetOrder(NULL,OP_SELLSTOP,Lotsi,ppS,sl,tp,MagicNumber,0,txt);// óñòàíàâëèâàåì      
      }
     else // åñòü ñåëëñòîï
      {
       if(GetOrderOpenPrice(NULL, OP_SELLSTOP, MagicNumber)!=ppS)
        {//ìîäèôèöèðóåì
         ti = TicketPos(NULL,OP_SELLSTOP,MagicNumber);
         if (OrderSelect(ti, SELECT_BY_TICKET))
          {
           if (StopLoss  >0) sl=ppS+StopLoss*Point;   else sl=0;
           if (TakeProfit>0) tp=ppS-TakeProfit*Point; else tp=0;
           ModifyOrder(ppS,sl,tp,Turquoise);
          }
        }      
      }    
    }
   }
//-----------------------------------------------------------------  
    if (ShowComment) {
      string st="CurTime="+TimeToStr(TimeCurrent(), TIME_MINUTES)
               +"  Ñòàðò="+StartHour+":"+StartMinute
               +"  Ñòîï="+StopHour+":"+StopMinute
               +"  Øèðèíà êàíàëà="+DoubleToStr(size_corridor/Point,0)+"p"
               +"  ÑË="+DoubleToStr(Fibo_StopLoss,0)+"%="+StopLoss+"p"
               +"  ÒÏ="+DoubleToStr(Fibo_TakeProfit,0)+"%="+TakeProfit+"p"
               +"  Lots="+DoubleToStr(Lotsi,2)
	            //+"\n\n Áàëàíñ="+DoubleToStr(AccountBalance(), 2)
               //+"\n Ýêâèòè="+DoubleToStr(AccountEquity(), 2)
               //+"\n Ïðèáûëü="+DoubleToStr(AccountEquity()-AccountBalance(),3)+" $"
               //+"\n Ïðèáûëü="+DoubleToStr((AccountEquity()/AccountBalance()-1)*100,3)+" %"
               ;
      Comment(st);
    } else Comment("");   
//-------------------------------------------------------------------
   return(0);
  }
//+------------------------------------------------------------------+
//+----------------------------------------------------------------------------+
//|  Àâòîð    : Êèì Èãîðü Â. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Âåðñèÿ   : 07.10.2006                                                     |
//|  Îïèñàíèå : Âîçâðàùàåò ýêñòðåìóì ÇèãÇàãà ïî åãî íîìåðó.                    |
//+----------------------------------------------------------------------------+
//|  Ïàðàìåòðû:                                                                |
//|    sy - íàèìåíîâàíèå èíñòðóìåíòà   (NULL èëè "" - òåêóùèé ñèìâîë)          |
//|    tf - òàéìôðåéì                  (      0     - òåêóùèé ÒÔ)              |
//|    ne - íîìåð ýêñòðåìóìà           (      0     - ïîñëåäíèé)               |
//|    dp - ExtDepth                                                           |
//|    dv - ExtDeviation                                                       |
//|    bs - ExtBackstep                                                        |
//+----------------------------------------------------------------------------+
double GetExtremumZZPrice(string sy="", int tf=0, int ne=0, int dp=12, int dv=5, int bs=3) {
  if (sy=="" || sy=="0") sy=Symbol();
  double zz;
  int    i, k=iBars(sy, tf), ke=0;

  for (i=0; i<k; i++) {
    zz=iCustom(sy, tf, "ZigZag", dp, dv, bs, 0, i);
    if (zz!=0) {
      ke++;
      if (ke>ne) return(zz);
    }
  }
  Print("GetExtremumZZPrice(): Ýêñòðåìóì ÇèãÇàãà íîìåð ",ne," íå íàéäåí");
  return(0);
}
//+----------------------------------------------------------------------------+
//|  Àâòîð    : Êèì Èãîðü Â. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Âåðñèÿ   : 30.03.2008                                                     |
//|  Îïèñàíèå : Óñòàíîâêà îáúåêòà OBJ_HLINE ãîðèçîíòàëüíàÿ ëèíèÿ               |
//+----------------------------------------------------------------------------+
//|  Ïàðàìåòðû:                                                                |
//|    cl - öâåò ëèíèè                                                         |
//|    nm - íàèìåíîâàíèå               ("" - âðåìÿ îòêðûòèÿ òåêóùåãî áàðà)     |
//|    p1 - öåíîâîé óðîâåíü            (0  - Bid)                              |
//|    st - ñòèëü ëèíèè                (0  - ïðîñòàÿ ëèíèÿ)                    |
//|    wd - øèðèíà ëèíèè               (0  - ïî óìîë÷àíèþ)                     |
//+----------------------------------------------------------------------------+
void SetHLine(color cl, string nm="", double p1=0, int st=0, int wd=1) {
  if (nm=="") nm=DoubleToStr(Time[0], 0);
  if (p1<=0) p1=Bid;
  if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_HLINE, 0, 0,0);
  ObjectSet(nm, OBJPROP_PRICE1, p1);
  ObjectSet(nm, OBJPROP_COLOR , cl);
  ObjectSet(nm, OBJPROP_STYLE , st);
  ObjectSet(nm, OBJPROP_WIDTH , wd);
}
//+----------------------------------------------------------------------------+                                                    |
//|  Îïèñàíèå : Âîçâðàùàåò ôëàã ñóùåñòâîâàíèÿ îðäåðîâ.                         |
//+----------------------------------------------------------------------------+
//|  Ïàðàìåòðû:                                                                |
//|    sy - íàèìåíîâàíèå èíñòðóìåíòà   (""   - ëþáîé ñèìâîë,                   |
//|                                     NULL - òåêóùèé ñèìâîë)                 |
//|    op - îïåðàöèÿ                   (-1   - ëþáîé îðäåð)                    |
//|    mn - MagicNumber                (-1   - ëþáîé ìàãèê)                    |
//|    ot - âðåìÿ îòêðûòèÿ             ( 0   - ëþáîå âðåìÿ óñòàíîâêè)          |
//+----------------------------------------------------------------------------+
bool ExistOrders(string sy="", int op=-1, int mn=-1, datetime ot=0) {
  int i, k=OrdersTotal(), ty;
 
  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      ty=OrderType();
      if (ty>1 && ty<6) {
        if ((OrderSymbol()==sy || sy=="") && (op<0 || ty==op)) {
          if (mn<0 || OrderMagicNumber()==mn) {
            if (ot<=OrderOpenTime()) return(True);
          }
        }
      }
    }
  }
  return(False);
}
//|  Îïèñàíèå : Âîçâðàùàåò ôëàã ñóùåñòâîâàíèÿ ïîçèöèé                          |
//+----------------------------------------------------------------------------+
//|  Ïàðàìåòðû:                                                                |
//|    sy - íàèìåíîâàíèå èíñòðóìåíòà   (""   - ëþáîé ñèìâîë,                   |
//|                                     NULL - òåêóùèé ñèìâîë)                 |
//|    op - îïåðàöèÿ                   (-1   - ëþáàÿ ïîçèöèÿ)                  |
//|    mn - MagicNumber                (-1   - ëþáîé ìàãèê)                    |
//|    ot - âðåìÿ îòêðûòèÿ             ( 0   - ëþáîå âðåìÿ îòêðûòèÿ)           |
//+----------------------------------------------------------------------------+
bool ExistPositions(string sy="", int op=-1, int mn=-1, datetime ot=0) {
  int i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (ot<=OrderOpenTime()) return(True);
            }
          }
        }
      }
    }
  }
  return(False);
}
//+----------------------------------------------------------------------------+
//| Àâòîð    : Êèì Èãîðü Â. aka KimIV,  http://www.kimiv.ru                    |
//+----------------------------------------------------------------------------+
//| Âåðñèÿ   : 28.11.2006                                                      |
//| Îïèñàíèå : Óäàëåíèå îðäåðîâ                                                |
//+----------------------------------------------------------------------------+
//| Ïàðàìåòðû:                                                                 |
//|   sy - íàèìåíîâàíèå èíñòðóìåíòà   ( ""  - ëþáîé ñèìâîë,                    |
//|                                    NULL - òåêóùèé ñèìâîë)                  |
//|   op - îïåðàöèÿ                   (  -1 - ëþáîé îðäåð)                     |
//|   mn - MagicNumber                (  -1 - ëþáîé ìàãèê)                     |
//+----------------------------------------------------------------------------+
void DeleteOrders(string sy="", int op=-1, int mn=-1) {
  bool fd;
  int err, i, it, k=OrdersTotal(), ot;
  
  if (sy=="0") sy=Symbol();
  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      ot=OrderType();
      if (ot>1 && ot<6) {
        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(5000);
              fd=OrderDelete(OrderTicket(), clDelete);
              if (fd) {
                if (UseSound) PlaySound(NameFileSound); break;
              } else {
                err=GetLastError();
                Print("Error(",err,") delete order ",GetNameOP(ot),
                      ": ",ErrorDescription(err),", try ",it);
                Sleep(1000*5);
              }
            }
          }
        }
      }
    }
  }
}
//+----------------------------------------------------------------------------+
//|  Îïèñàíèå : Âîçâðàùàåò íàèìåíîâàíèå òàéìôðåéìà                             |
//+----------------------------------------------------------------------------+
//|  Ïàðàìåòðû:                                                                |
//|    TimeFrame - òàéìôðåéì (êîëè÷åñòâî ñåêóíä)      (0 - òåêóùèé ÒÔ)         |
//+----------------------------------------------------------------------------+
string GetNameTF(int TimeFrame=0) {
  if (TimeFrame==0) TimeFrame=Period();
  switch (TimeFrame) {
    case PERIOD_M1:  return("M1");
    case PERIOD_M5:  return("M5");
    case PERIOD_M15: return("M15");
    case PERIOD_M30: return("M30");
    case PERIOD_H1:  return("H1");
    case PERIOD_H4:  return("H4");
    case PERIOD_D1:  return("Daily");
    case PERIOD_W1:  return("Weekly");
    case PERIOD_MN1: return("Monthly");
    default:         return("UnknownPeriod");
  }
}
//|  Îïèñàíèå : Âîçâðàùàåò íàèìåíîâàíèå òîðãîâîé îïåðàöèè                      |
//+----------------------------------------------------------------------------+
//|  Ïàðàìåòðû:                                                                |
//|    op - èäåíòèôèêàòîð òîðãîâîé îïåðàöèè                                    |
//+----------------------------------------------------------------------------+
string GetNameOP(int op) {
  switch (op) {
    case OP_BUY      : return("Buy");
    case OP_SELL     : return("Sell");
    case OP_BUYLIMIT : return("Buy Limit");
    case OP_SELLLIMIT: return("Sell Limit");
    case OP_BUYSTOP  : return("Buy Stop");
    case OP_SELLSTOP : return("Sell Stop");
    default          : return("Unknown Operation");
  }
}
//+----------------------------------------------------------------------------+
//|  Îïèñàíèå : Âûâîä ñîîáùåíèÿ â êîììåíò è â æóðíàë                           |
//+----------------------------------------------------------------------------+
//|  Ïàðàìåòðû:                                                                |
//|    m - òåêñò ñîîáùåíèÿ                                                     |
//+----------------------------------------------------------------------------+
void Message(string m) {
  Comment(m);
  if (StringLen(m)>0) Print(m);
}
//+----------------------------------------------------------------------------+                                                    |
//|  Îïèñàíèå : Óñòàíîâêà îðäåðà.                                              |
//+----------------------------------------------------------------------------+
//|  Ïàðàìåòðû:                                                                |
//|    sy - íàèìåíîâàíèå èíñòðóìåíòà   (NULL èëè "" - òåêóùèé ñèìâîë)          |
//|    op - îïåðàöèÿ                                                           |
//|    ll - ëîò                                                                |
//|    pp - öåíà                                                               |
//|    sl - óðîâåíü ñòîï                                                       |
//|    tp - óðîâåíü òåéê                                                       |
//|    mn - Magic Number                                                       |
//|    ex - Ñðîê èñòå÷åíèÿ                                                     |
//+----------------------------------------------------------------------------+
void SetOrder(string sy, int op, double ll, double pp,
              double sl=0, double tp=0, int mn=0, datetime ex=0, string com="") {
  color    clOpen;
  datetime ot;
  double   pa, pb, mp;
  int      err, it, ticket, msl;
  string   lsComm= com+"   /"+ WindowExpertName()+" "+GetNameTF(Period());

  if (sy=="" || sy=="0") sy=Symbol();
  msl=MarketInfo(sy, MODE_STOPLEVEL);
  if (op==OP_BUYLIMIT || op==OP_BUYSTOP) clOpen=clOpenBuy; else clOpen=clOpenSell;
  if (ex>0 && ex<TimeCurrent()) ex=0;
  for (it=1; it<=NumberOfTry; it++) {
    if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) {
      Print("SetOrder(): Îñòàíîâêà ðàáîòû ôóíêöèè");
      break;
    }
    while (!IsTradeAllowed()) Sleep(5000);
    RefreshRates();
    ot=TimeCurrent(); if(ObjectFind("label")>-1)
    ticket=OrderSend(sy, op, ll, pp, Slippage, sl, tp, lsComm, mn, ex, clOpen);
    if (ticket>0) {
      if (UseSound) PlaySound(NameFileSound); break;
    } else {
      err=GetLastError();
      if (err==128 || err==142 || err==143) {
        Sleep(1000*66);
        if (ExistOrders(sy, op, mn, ot)) {
          if (UseSound) PlaySound(NameFileSound); break;
        }
        Print("Error(",err,") set order: ",ErrorDescription(err),", try ",it);
        continue;
      }
      mp=MarketInfo(sy, MODE_POINT);
      pa=MarketInfo(sy, MODE_ASK);
      pb=MarketInfo(sy, MODE_BID);
      // Íåïðàâèëüíûå ñòîïû
      if (err==130) {
        switch (op) {
          case OP_BUYLIMIT:
            if (pp>pa-msl*mp) pp=pa-msl*mp;
            if (sl>pp-(msl+1)*mp) sl=pp-(msl+1)*mp;
            if (tp>0 && tp<pp+(msl+1)*mp) tp=pp+(msl+1)*mp;
            break;
          case OP_BUYSTOP:
            if (pp<pa+(msl+1)*mp) pp=pa+(msl+1)*mp;
            if (sl>pp-(msl+1)*mp) sl=pp-(msl+1)*mp;
            if (tp>0 && tp<pp+(msl+1)*mp) tp=pp+(msl+1)*mp;
            break;
          case OP_SELLLIMIT:
            if (pp<pb+msl*mp) pp=pb+msl*mp;
            if (sl>0 && sl<pp+(msl+1)*mp) sl=pp+(msl+1)*mp;
            if (tp>pp-(msl+1)*mp) tp=pp-(msl+1)*mp;
            break;
          case OP_SELLSTOP:
            if (pp>pb-msl*mp) pp=pb-msl*mp;
            if (sl>0 && sl<pp+(msl+1)*mp) sl=pp+(msl+1)*mp;
            if (tp>pp-(msl+1)*mp) tp=pp-(msl+1)*mp;
            break;
        }
        Print("SetOrder(): Ñêîððåêòèðîâàíû öåíîâûå óðîâíè");
      }
      Print("Error(",err,") set order: ",ErrorDescription(err),", try ",it);
      Print("Ask=",pa,"  Bid=",pb,"  sy=",sy,"  ll=",ll,"  op=",GetNameOP(op),
            "  pp=",pp,"  sl=",sl,"  tp=",tp,"  mn=",mn);
      if (pa==0 && pb==0) Message("SetOrder(): Ïðîâåðüòå â îáçîðå ðûíêà íàëè÷èå ñèìâîëà "+sy);
      // Áëîêèðîâêà ðàáîòû ñîâåòíèêà
      if (err==2 || err==64 || err==65 || err==133) {
        gbDisabled=True; break;
      }
      // Äëèòåëüíàÿ ïàóçà
      if (err==4 || err==131 || err==132) {
        Sleep(1000*300); break;
      }
      // Ñëèøêîì ÷àñòûå çàïðîñû (8) èëè ñëèøêîì ìíîãî çàïðîñîâ (141)
      if (err==8 || err==141) Sleep(1000*100);
      if (err==139 || err==140 || err==148) break;
      // Îæèäàíèå îñâîáîæäåíèÿ ïîäñèñòåìû òîðãîâëè
      if (err==146) while (IsTradeContextBusy()) Sleep(1000*11);
      // Îáíóëåíèå äàòû èñòå÷åíèÿ
      if (err==147) {
        ex=0; continue;
      }
      if (err!=135 && err!=138) Sleep(1000*7.7);
    }
  }
}
//+----------------------------------------------------------------------------+
//|  Àâòîð    : Êèì Èãîðü Â. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Âåðñèÿ   : 28.11.2006                                                     |
//|  Îïèñàíèå : Âîçâðàùàåò öåíó óñòàíîâêè ïîñëåäíåãî îðäåðà èëè 0.             |
//+----------------------------------------------------------------------------+
//|  Ïàðàìåòðû:                                                                |
//|    sy - íàèìåíîâàíèå èíñòðóìåíòà   (""   - ëþáîé ñèìâîë,                   |
//|                                     NULL - òåêóùèé ñèìâîë)                 |
//|    op - îïåðàöèÿ                   (-1   - ëþáàÿ ïîçèöèÿ)                  |
//|    mn - MagicNumber                (-1   - ëþáîé ìàãèê)                    |
//+----------------------------------------------------------------------------+
double GetOrderOpenPrice(string sy="", int op=-1, int mn=-1) {
  datetime t;
  double   r=0;
  int      i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()>1 && OrderType()<6) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderOpenTime()) {
                t=OrderOpenTime();
                r=OrderOpenPrice();
              }
            }
          }
        }
      }
    }
  }
  return(r);
}
//+----------------------------------------------------------------------------+
//|  Âåðñèÿ   : 19.02.2008                                                     |
//|  Îïèñàíèå : Âîçâðàùàåò òèêåò ïîñëåäíåé îòêðûòîé ïîçèöèè èëè -1             |
//+----------------------------------------------------------------------------+
//|  Ïàðàìåòðû:                                                                |
//|    sy - íàèìåíîâàíèå èíñòðóìåíòà   (""   - ëþáîé ñèìâîë,                   |
//|                                     NULL - òåêóùèé ñèìâîë)                 |
//|    op - îïåðàöèÿ                   (-1   - ëþáàÿ ïîçèöèÿ)                  |
//|    mn - MagicNumber                (-1   - ëþáîé ìàãèê)                    |
//+----------------------------------------------------------------------------+
int TicketPos(string sy="", int op=-1, int mn=-1) {
  datetime o;
  int      i, k=OrdersTotal(), r=-1;

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (o<OrderOpenTime()) {
                o=OrderOpenTime();
                r=OrderTicket();
              }
            }
          }
        }
      }
    }
  }
  return(r);
}
//+----------------------------------------------------------------------------+
//|  Âåðñèÿ   : 28.11.2006                                                     |
//|  Îïèñàíèå : Ìîäèôèêàöèÿ îäíîãî ïðåäâàðèòåëüíî âûáðàííîãî îðäåðà.           |
//+----------------------------------------------------------------------------+
//|  Ïàðàìåòðû:                                                                |
//|    pp - öåíà óñòàíîâêè îðäåðà                                              |
//|    sl - öåíîâîé óðîâåíü ñòîïà                                              |
//|    tp - öåíîâîé óðîâåíü òåéêà                                              |
//|    cl - öâåò çíà÷êà ìîäèôèêàöèè                                            |
//+----------------------------------------------------------------------------+
void ModifyOrder(double pp=-1, double sl=0, double tp=0, color cl=CLR_NONE) {
  bool   fm;
  double op, pa, pb, os, ot;
  int    dg=MarketInfo(OrderSymbol(), MODE_DIGITS), er, it;
 
  if (pp<=0) pp=OrderOpenPrice();
  if (sl<0 ) sl=OrderStopLoss();
  if (tp<0 ) tp=OrderTakeProfit();
  
  pp=NormalizeDouble(pp, dg);
  sl=NormalizeDouble(sl, dg);
  tp=NormalizeDouble(tp, dg);
  op=NormalizeDouble(OrderOpenPrice() , dg);
  os=NormalizeDouble(OrderStopLoss()  , dg);
  ot=NormalizeDouble(OrderTakeProfit(), dg);
 
  if (pp!=op || sl!=os || tp!=ot) {
    for (it=1; it<=NumberOfTry; it++) {
      if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;
      while (!IsTradeAllowed()) Sleep(5000);
      RefreshRates();
      fm=OrderModify(OrderTicket(), pp, sl, tp, 0, cl);
      if (fm) {
        if (UseSound) PlaySound(NameFileSound); break;
      } else {
        er=GetLastError();
        pa=MarketInfo(OrderSymbol(), MODE_ASK);
        pb=MarketInfo(OrderSymbol(), MODE_BID);
        Print("Error(",er,") modifying order: ",ErrorDescription(er),", try ",it);
        Print("Ask=",pa,"  Bid=",pb,"  sy=",OrderSymbol(),
              "  op="+GetNameOP(OrderType()),"  pp=",pp,"  sl=",sl,"  tp=",tp);
        Sleep(1000*10);
      }
    }
  }
}
//+----------------------------------------------------------------------------+
//|  Àâòîð    : Êèì Èãîðü Â. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Âåðñèÿ   : 30.04.2009                                                     |
//|  Îïèñàíèå : Âîçâðàùàåò ôëàã ðàçðåøåíèÿ òîðãîâëè ïî âðåìåíè.                |
//+----------------------------------------------------------------------------+
//|  Ïàðàìåòðû:                                                                |
//|    hb - ÷àñû âðåìåíè íà÷àëà òîðãîâëè                                       |
//|    mb - ìèíóòû âðåìåíè íà÷àëà òîðãîâëè                                     |
//|    he - ÷àñû âðåìåíè îêîí÷àíèÿ òîðãîâëè                                    |
//|    me - ìèíóòû âðåìåíè îêîí÷àíèÿ òîðãîâëè                                  |
//+----------------------------------------------------------------------------+
bool isTradeTimeInt(int hb=0, int mb=0, int he=0, int me=0) {
  datetime db, de;           // Âðåìÿ íà÷àëà è îêîí÷àíèÿ ðàáîòû
  int      hc;               // ×àñû òåêóùåãî âðåìåíè òîðãîâîãî ñåðâåðà

  db=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+hb+":"+mb);
  de=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+he+":"+me);
  hc=TimeHour(TimeCurrent());
  if (db>=de) {
    if (hc>=he) de+=24*60*60; else db-=24*60*60;
  }

  if (TimeCurrent()>=db && TimeCurrent()<=de) return(True);
  else return(False);
}
//+----------------------------------------------------------------------------+
//|  Àâòîð    : Þðèé Òîêìàíü ,  yuriytokman@gmail.com                          |
//+----------------------------------------------------------------------------+
//|  Îïèñàíèå : ðàñ÷¸ò ëîòà îò ïðîöåíòà äåïîçèòà                               |
//+----------------------------------------------------------------------------+ 
 double GetLot()
  {
   double metod  = 0;
   if(Choice_method)metod = AccountBalance();
   else metod = AccountFreeMargin();
   double MinLot = MarketInfo(Symbol(),MODE_MINLOT);
   double MaxLot = MarketInfo(Symbol(),MODE_MAXLOT);
   double Prots = Risk/100;
   double Lotsi=MathFloor(metod*Prots/MarketInfo(Symbol(),MODE_MARGINREQUIRED)
               /MarketInfo(Symbol(),MODE_LOTSTEP))*MarketInfo(Symbol(),MODE_LOTSTEP);// Ëîòû
   if(Lotsi<MinLot)Lotsi=MinLot;
   if(Lotsi>MaxLot)Lotsi=MaxLot;               
   return(Lotsi);
  }
//+----------------------------------------------------------------------------+
//|  Àâòîð    : Êèì Èãîðü Â. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Âåðñèÿ   : 11.09.2008                                                     |
//|  Îïèñàíèå : Ïåðåíîñ óðîâíÿ ñòîïà â áåçóáûòîê                               |
//+----------------------------------------------------------------------------+
//|  Ïàðàìåòðû:                                                                |
//|    sy - íàèìåíîâàíèå èíñòðóìåíòà   ( ""  - ëþáîé ñèìâîë,                   |
//|                                     NULL - òåêóùèé ñèìâîë)                 |
//|    op - îïåðàöèÿ                   ( -1  - ëþáàÿ ïîçèöèÿ)                  |
//|    mn - MagicNumber                ( -1  - ëþáîé ìàãèê)                    |
//+----------------------------------------------------------------------------+
void MovingInWL(string sy="", int op=-1, int mn=-1) {
  double po, pp;
  int    i, k=OrdersTotal();

  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      po=MarketInfo(OrderSymbol(), MODE_POINT);
      if (OrderType()==OP_BUY) {
        if (OrderStopLoss()-OrderOpenPrice()<LevelWLoss*po) {
          pp=MarketInfo(OrderSymbol(), MODE_BID);
          if (pp-OrderOpenPrice()>LevelProfit*po) {
            ModifyOrder(-1, OrderOpenPrice()+LevelWLoss*po, -1);
          }
        }
      }
      if (OrderType()==OP_SELL) {
        if (OrderStopLoss()==0 || OrderOpenPrice()-OrderStopLoss()<LevelWLoss*po) {
          pp=MarketInfo(OrderSymbol(), MODE_ASK);
          if (OrderOpenPrice()-pp>LevelProfit*po) {
            ModifyOrder(-1, OrderOpenPrice()-LevelWLoss*po, -1);
          }
        }
      }
    }
  }
}
//+----------------------------------------------------------------------+
//| Îïèñàíèå: Ñîçäàíèå òåêñòîâîé ìåòêè                                   | 
//| Àâòîð:    Þðèé Òîêìàíü                                               |
//| e-mail:   yuriytokman@gmail.com                                      |
//+----------------------------------------------------------------------+
 void Label(string name_label,           //Èìÿ îáúåêòà.
            string text_label,           //Òåêñò îáüåêòà. 
            int corner = 2,              //Hîìåð óãëà ïðèâÿçêè 
            int x = 3,                   //Pàññòîÿíèå X-êîîðäèíàòû â ïèêñåëÿõ 
            int y = 15,                   //Pàññòîÿíèå Y-êîîðäèíàòû â ïèêñåëÿõ 
            int font_size = 10,          //Ðàçìåð øðèôòà â ïóíêòàõ.
            string font_name = "Arial",  //Íàèìåíîâàíèå øðèôòà.
            color text_color = LimeGreen //Öâåò òåêñòà.
           )
  {
   if (ObjectFind(name_label)!=-1) ObjectDelete(name_label);
       ObjectCreate(name_label,OBJ_LABEL,0,0,0,0,0);         
       ObjectSet(name_label,OBJPROP_CORNER,corner);
       ObjectSet(name_label,OBJPROP_XDISTANCE,x);
       ObjectSet(name_label,OBJPROP_YDISTANCE,y);
       ObjectSetText(name_label,text_label,font_size,font_name,text_color);
  }



Sample





Analysis



Market Information Used:

Series array that contains open time of each bar


Indicator Curves created:


Indicators Used:




Custom Indicators Used:
ZigZag

Order Management characteristics:
Checks for the total of open orders
It automatically opens orders when conditions are reached
It can change open orders parameters, due to possible stepping strategy

Other Features:


It plays sound alerts

BackTest : USDJPY on H1

From 2009-11-01 to 2009-11-30 Profit Factor:0.00 Total Net Profit:0.00

BackTest : USDCHF on H1

From 2009-12-01 to 2010-01-01 Profit Factor:0.00 Total Net Profit:0.00

BackTest : EURUSD on H1

From 2009-12-01 to 2010-01-17 Profit Factor:0.00 Total Net Profit:0.00

BackTest : USDCAD on H1

From 2009-12-01 to 2010-01-01 Profit Factor:0.00 Total Net Profit:0.00

BackTest : EURUSD on H1

From 2009-08-01 to 2009-10-01 Profit Factor:0.00 Total Net Profit:0.00

BackTest : GBPUSD on H1

From 2010-01-01 to 2010-02-27 Profit Factor:0.00 Total Net Profit:0.00

BackTest : EURUSD on H1

From 2010-04-01 to 2010-04-30 Profit Factor:0.00 Total Net Profit:0.00

BackTest : EURUSD on H1

From 2010-05-01 to 2010-05-31 Profit Factor:0.00 Total Net Profit:0.00

BackTest : EURUSD on H1

From 2010-06-01 to 2010-06-30 Profit Factor:0.00 Total Net Profit:0.00

Request Backtest for EXP_FIBO_ZZ


From : (yyyy/mm/dd) To: (yyyy/mm/dd)

Pair: Period: