Navigation:Home > Content >

iCamarillaLevel.mq4

Time: 2014-03-08 | Download file:iCamarillaLevel.mq4

//+------------------------------------------------------------------+
//| 21.01.2009                              iCamarillaLevels_v4B.mq4 |
//+------------------------------------------------------------------+
// v2 - добавил возможность расчета уровней и по дневным, и по 
//      недельным барам
// v3 - добавил возможность расчета с учетом GMT
// v4,
// v4А- поправил отрисовку уровней на нулевом баре после перехода GMT,
//      а так же исправил найденные ошибки в расчете уровней
//
//      примечание:
//      1. после запуска индикатора ценовые метки и имена уровней
//      появляются только после новой котировки
//      2. выходными индикатор считает все субботы и воскресенья,
//      выходных среди недели замечать не умеет
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, Bookkeeper"
#property link      "[email protected]"

#property indicator_chart_window
#property indicator_buffers 6
#property indicator_color1  Maroon  // L3
#property indicator_color2  Navy    // L4
#property indicator_color3  Magenta // L5
#property indicator_color4  Maroon  // H3
#property indicator_color5  Navy    // H4
#property indicator_color6  Magenta // H5

extern int Period_X=240; // начиная с какого ТФ расчитывать по недельным барам
extern int ShihtGMT=1;  // сдвиг в часах времени терминала относительно GMT

double LLevel3[];
double LLevel4[];
double LLevel5[];
double HLevel3[];
double HLevel4[];
double HLevel5[];

datetime prevD=0;
int Period_L, prevBars=0;
bool WithShift;
//+------------------------------------------------------------------+
int init() 
{
   if(Period()>=Period_X)
   {
      Period_L=PERIOD_W1;
      WithShift=false;
   }
   else
   {
      Period_L=PERIOD_D1;
      WithShift=true;
   }
   IndicatorBuffers(6);
   SetIndexStyle (0,DRAW_LINE); 
   SetIndexStyle (1,DRAW_LINE); 
   SetIndexStyle (2,DRAW_LINE,STYLE_DASH); 
   SetIndexStyle (3,DRAW_LINE); 
   SetIndexStyle (4,DRAW_LINE); 
   SetIndexStyle (5,DRAW_LINE,STYLE_DASH); 
   SetIndexBuffer(0,LLevel3);
   SetIndexBuffer(1,LLevel4);
   SetIndexBuffer(2,LLevel5);
   SetIndexBuffer(3,HLevel3);
   SetIndexBuffer(4,HLevel4);
   SetIndexBuffer(5,HLevel5);
   return(0); 
}
//+------------------------------------------------------------------+
int deinit()
{
   //         Comment("");  // только для отладки
   ObjectDelete("CamarillaHL3");
   ObjectDelete("CamarillaHL4");
   ObjectDelete("CamarillaHL5");
   ObjectDelete("CamarillaLL3");
   ObjectDelete("CamarillaLL4");
   ObjectDelete("CamarillaLL5");
   ObjectDelete("CamarillaTH3");
   ObjectDelete("CamarillaTH4");
   ObjectDelete("CamarillaTH5");
   ObjectDelete("CamarillaTL3");
   ObjectDelete("CamarillaTL4");
   ObjectDelete("CamarillaTL5");
   return(0); 
}
//+------------------------------------------------------------------+
int start() 
{
   if(Period_X>1440) return(-1);
   if(Period()>1440) return(-1);
   int limit,counted_bars=IndicatorCounted();
   if (counted_bars<0) return(-1);
   if (counted_bars>0) counted_bars--;
   limit=Bars-counted_bars-2;
   int nd=iBars(NULL,Period_L)-1;
   datetime tnd1=iTime(NULL,Period_L,nd-1);
   if(Time[limit]0)
      {
         int n_today=TimeDayOfWeek(iTime(NULL,Period_L,n-1));
         // вечерние часы на нулевом баре при переходе через 24:00 GMT
         if(n==1 && n_today!=5 && TimeHour(Time[0])>=(24-ShihtGMT))
         {
            s=TimeToStr(Time[0],TIME_DATE)+" "+(24-ShihtGMT)+":00";
            today_open_time=StrToTime(s);
            if(n_today==1) // для понедельника
               yesterday_open_time=iTime(NULL,Period_L,n-1);
            else // для остальных дней
            {
               s=TimeToStr(iTime(NULL,Period_L,n),TIME_DATE)+" "+(24-ShihtGMT)+":00";
               yesterday_open_time=StrToTime(s);
            }
         }
         // утренние и дневные часы до 24:00 GMT
         else 
         {
            // пересчет дня недели
            if(TimeHour(Time[0])>=(24-ShihtGMT))
            {
               nn=n-1;
               n_today=TimeDayOfWeek(iTime(NULL,Period_L,nn-1));
            }
            else nn=n;
            
            if(n_today==1) // для понедельника "вчерашний" день - пятница
            {
               today_open_time=iTime(NULL,Period_L,nn-1);
               s=TimeToStr(iTime(NULL,Period_L,nn+1),TIME_DATE)+" "+(24-ShihtGMT)+":00";
               yesterday_open_time=StrToTime(s);
            }
            if(n_today==2) // для вторника вчерашний день - понедельник 
            {
               s=TimeToStr(iTime(NULL,Period_L,nn),TIME_DATE)+" "+(24-ShihtGMT)+":00";
               today_open_time=StrToTime(s);
               yesterday_open_time=iTime(NULL,Period_L,nn);
            }
            if(n_today>2 && n_today<6) // для среды, четверга и пятницы расчет вчерашнего дня
            {
               s=TimeToStr(iTime(NULL,Period_L,nn),TIME_DATE)+" "+(24-ShihtGMT)+":00";
               today_open_time=StrToTime(s);
               s=TimeToStr(iTime(NULL,Period_L,nn+1),TIME_DATE)+" "+(24-ShihtGMT)+":00";
               yesterday_open_time=StrToTime(s);
            }
         }
         yesterday_close_bar=iBarShift(NULL,0,today_open_time)+1;
         c=Close[yesterday_close_bar];
         int j=yesterday_close_bar;
         while(Time[j]>=yesterday_open_time && i<=limit) j++;
         count=j-yesterday_close_bar;
         h=High[iHighest(NULL,0,MODE_HIGH,count,yesterday_close_bar)];
         l=Low[iLowest(NULL,0,MODE_LOW,count,yesterday_close_bar)];
         // только для отладки
         //if(n==2) Comment(s);
      }
      else
      {
         today_open_time=iTime(NULL,Period_L,n-1);
         c=iClose(NULL,Period_L,n);
         h=iHigh(NULL,Period_L,n);
         l=iLow(NULL,Period_L,n);
      }
      
      if(i==0)
      {
         datetime D=today_open_time;
         // только для отладки
         //Comment(c," ",h," ",l);
      }
      
      while(Time[i]>=today_open_time && i<=limit)
      {
         HLevel3[i]=NormalizeDouble((c+(h-l)*1.1/4),Digits);
         HLevel4[i]=NormalizeDouble((c+(h-l)*1.1/2),Digits);
         HLevel5[i]=NormalizeDouble(h/l*c,Digits);
         LLevel3[i]=NormalizeDouble((c-(h-l)*1.1/4),Digits);
         LLevel4[i]=NormalizeDouble((c-(h-l)*1.1/2),Digits);
         LLevel5[i]=NormalizeDouble(c*2,Digits)-HLevel5[i];
         i++;
      }
      i--;
      n++;
   }
   
   if(prevBars!=Bars)
   {
   prevBars=Bars;
   ObjectDelete("CamarillaHL3");
   ObjectDelete("CamarillaHL4");
   ObjectDelete("CamarillaHL5");
   ObjectDelete("CamarillaLL3");
   ObjectDelete("CamarillaLL4");
   ObjectDelete("CamarillaLL5");
   ObjectCreate("CamarillaHL3",OBJ_ARROW,0,Time[0],HLevel3[0]);
   ObjectSet   ("CamarillaHL3",OBJPROP_ARROWCODE,SYMBOL_RIGHTPRICE);   
   ObjectCreate("CamarillaHL4",OBJ_ARROW,0,Time[0],HLevel4[0]);
   ObjectSet   ("CamarillaHL4",OBJPROP_ARROWCODE,SYMBOL_RIGHTPRICE);   
   ObjectCreate("CamarillaHL5",OBJ_ARROW,0,Time[0],HLevel5[0]);
   ObjectSet   ("CamarillaHL5",OBJPROP_ARROWCODE,SYMBOL_RIGHTPRICE);   
   ObjectCreate("CamarillaLL3",OBJ_ARROW,0,Time[0],LLevel3[0]);
   ObjectSet   ("CamarillaLL3",OBJPROP_ARROWCODE,SYMBOL_RIGHTPRICE);   
   ObjectCreate("CamarillaLL4",OBJ_ARROW,0,Time[0],LLevel4[0]);
   ObjectSet   ("CamarillaLL4",OBJPROP_ARROWCODE,SYMBOL_RIGHTPRICE);   
   ObjectCreate("CamarillaLL5",OBJ_ARROW,0,Time[0],LLevel5[0]);
   ObjectSet   ("CamarillaLL5",OBJPROP_ARROWCODE,SYMBOL_RIGHTPRICE);   
   ObjectSet   ("CamarillaHL3",OBJPROP_COLOR,Maroon);
   ObjectSet   ("CamarillaHL4",OBJPROP_COLOR,Navy);
   ObjectSet   ("CamarillaHL5",OBJPROP_COLOR,Magenta);
   ObjectSet   ("CamarillaLL3",OBJPROP_COLOR,Maroon);   
   ObjectSet   ("CamarillaLL4",OBJPROP_COLOR,Navy);   
   ObjectSet   ("CamarillaLL5",OBJPROP_COLOR,Magenta);
   ObjectDelete ("CamarillaTH3");
   ObjectDelete ("CamarillaTH4");
   ObjectDelete ("CamarillaTH5");
   ObjectDelete ("CamarillaTL3");
   ObjectDelete ("CamarillaTL4");
   ObjectDelete ("CamarillaTL5");
   ObjectCreate ("CamarillaTH3",OBJ_TEXT,0,D,HLevel3[0]);
   ObjectSetText("CamarillaTH3","      H3",10,"System",Maroon);
   ObjectCreate ("CamarillaTH4",OBJ_TEXT,0,D,HLevel4[0]);
   ObjectSetText("CamarillaTH4","      H4",10,"System",Navy);
   ObjectCreate ("CamarillaTH5",OBJ_TEXT,0,D,HLevel5[0]);
   ObjectSetText("CamarillaTH5","      H5",10,"System",Magenta);
   ObjectCreate ("CamarillaTL3",OBJ_TEXT,0,D,LLevel3[0]);
   ObjectSetText("CamarillaTL3","      L3",10,"System",Maroon);
   ObjectCreate ("CamarillaTL4",OBJ_TEXT,0,D,LLevel4[0]);
   ObjectSetText("CamarillaTL4","      L4",10,"System",Navy);
   ObjectCreate ("CamarillaTL5",OBJ_TEXT,0,D,LLevel5[0]);
   ObjectSetText("CamarillaTL5","      L5",10,"System",Magenta);
   ObjectDelete ("CamarillaTH3");
   ObjectDelete ("CamarillaTH4");
   ObjectDelete ("CamarillaTH5");
   ObjectDelete ("CamarillaTL3");
   ObjectDelete ("CamarillaTL4");
   ObjectDelete ("CamarillaTL5");
   ObjectCreate ("CamarillaTH3",OBJ_TEXT,0,D,HLevel3[0]);
   ObjectSetText("CamarillaTH3","      H3",10,"System",Maroon);
   ObjectCreate ("CamarillaTH4",OBJ_TEXT,0,D,HLevel4[0]);
   ObjectSetText("CamarillaTH4","      H4",10,"System",Navy);
   ObjectCreate ("CamarillaTH5",OBJ_TEXT,0,D,HLevel5[0]);
   ObjectSetText("CamarillaTH5","      H5",10,"System",Magenta);
   ObjectCreate ("CamarillaTL3",OBJ_TEXT,0,D,LLevel3[0]);
   ObjectSetText("CamarillaTL3","      L3",10,"System",Maroon);
   ObjectCreate ("CamarillaTL4",OBJ_TEXT,0,D,LLevel4[0]);
   ObjectSetText("CamarillaTL4","      L4",10,"System",Navy);
   ObjectCreate ("CamarillaTL5",OBJ_TEXT,0,D,LLevel5[0]);
   ObjectSetText("CamarillaTL5","      L5",10,"System",Magenta);
   }

   return(0); 
}

Recommend