Navigation:Home > Content >

Уровни.mq4

Time: 2013-09-15 | Download file:Уровни.mq4

//+------------------------------------------------------------------+
//|                                                       Уровни.mq4 |
//|                                                    Ilnur & Abdul |
//|                                                                  |
//+------------------------------------------------------------------+

//   Индикатор отображает индекс вариации ценового ряда, вычисленного
// на минимальном предшествующем интервале длины 2^n. Индекс вариации
// показывает, что преобладает во временном ряду – трендовая или флетовая
// составляющая, или же ряд ведет себя случайно.

// М.М. Дубовиков и др. - Размерность минимального покрытия и локальный
// анализ фрактальных временных рядов.

#property copyright "Всем привет"

//---- настройки индикатора
#property indicator_separate_window
#property indicator_buffers    1
#property indicator_color1     Red
#property indicator_level1     0.65
#property indicator_level2     0.35
#property indicator_levelcolor Yellow
#property indicator_height     91
//---- входные параметры
extern int n               = 5;
extern int Бары_истории    = 13000;// Кол-во баров для отображения индикатора
extern int Расчет_уровня   = 19;   // Кол-во последних баров участвующих в формировании уровня
extern int Диапазон_цены   = 25;   // Максимально допустимый рэндж для расчетов
extern int Высота_движения = 14;   // Изменение показателя индикатора за последние n баров
extern int Уход_от_уровня  = 30;   // Кол-во пунктов для индикации уровня
extern int Подход_к_уровню = 5;    // Кол-во пунктов от уровня для сигнала после индикации 
extern int Длина           = 150;  // Длина уровня в барах
extern int Промежуток      = 12;   // Минимальное расстояние в барах между уровнями
//---- буфер индикатора
double ibuffer[];

int длина = Длина*300;             // Длина для пятиминуток
int промежуток = Промежуток*300;   // Расстояние для пятиминуток
bool Флаг_покупок[5]={false,false,false,false,false};
bool Флаг_продаж[5]={false,false,false,false,false};
datetime TimeCurr; 
//+------------------------------------------------------------------+
//| Функция инициализации индикатора                                 |
//+------------------------------------------------------------------+
int init(){
//---- настройка параметров отрисовки
   SetIndexBuffer(0,ibuffer);
   SetIndexStyle(0,DRAW_LINE);
   SetIndexDrawBegin(0,Bars-Бары_истории);
   SetIndexLabel(0,"Уровни");
//---- "короткое имя" отображаемое в окне индикатора
   IndicatorShortName("Уровни("+n+")");
   return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit() {
 /* if (UninitializeReason() == REASON_CHARTCHANGE ||
      UninitializeReason() == REASON_PARAMETERS)return (0);
  int obj_total=ObjectsTotal();
   for(int obj=obj_total-1; obj>=0; obj--){
      string objname=ObjectName(obj);
      if(StringFind(objname,"Уровень")>=0)ObjectDelete(objname);
     }*/
   return (0);
}
//+------------------------------------------------------------------+
//| Основная функция индикатора                                      |
//+------------------------------------------------------------------+
int start()
{
   int i, j, k, nTotal, nCountedBars = IndicatorCounted();
   int ihigh, ilow, nInterval;
   double Delta, Xс, Yс, Sx, Sy, Sxx, Sxy;
//---- последний посчитанный бар будет пересчитан
   if(nCountedBars==0) nTotal = Бары_истории;
   if(nCountedBars>0) nTotal = Bars-nCountedBars-1;
//---- основной цикл индикатора
   for(j=nTotal; j>=0; j--)
   {
      Sx = 0; Sy = 0; Sxx = 0; Sxy = 0;
      for(i=0; i<=n; i++)
      {
         nInterval = MathPow(2,n-i);
      //---- суммируем разницы максимальной и минимальной цен на интервале
         for(Delta=0, k=0; kДиапазон_цены *Point())return(0);       // если не укладываемся в диапазон, то не интересует
    double Высота = ibuffer[0] - ibuffer[index];         // расчет движения     
 if(TimeCurrent()>TimeCurr+промежуток){                  // если с отрисовки последнего уровня не прошел час пропускаем
   if(Высота >= Высота_движения *0.01 && Высота < 1){
    if (UninitializeReason() != REASON_CHARTCHANGE){
      TimeCurr=TimeCurrent();
      for(i=0; i<5; i++){
       if( ObjectFind("Уровень"+i)==-1){                 // устанавливаем уровень если не установлен
         Уровень(i,Цена_уровня);   
         Alert("Образовался уровень на  ",Symbol());
         PlaySound("Уровень.wav");
         ObjectDelete("Уровень"+(i+1));
         if(i==4)ObjectDelete("Уровень0");
         return(0);
       }
      }
    }    
   }
 } 
// перекрашивает уровень и дает сигнал в зависимости от ситуации  
 for(i=0; i<5; i++){
   double  value=ObjectGetValueByShift("Уровень"+i,0);
   if(value == 0)continue;
   if(Bid > value+Уход_от_уровня*Point()){ObjectSet("Уровень"+i,OBJPROP_COLOR,clrGreen);Флаг_покупок[i] = true;} 
   if(Bid < value-Уход_от_уровня*Point()){ObjectSet("Уровень"+i,OBJPROP_COLOR,clrRed); Флаг_продаж[i] = true;} 
   if(Флаг_покупок[i] == true && Bid < value+Подход_к_уровню*Point()){Alert("Подход цены к уровню на  ",Symbol());PlaySound("Подход к уровню.wav");Флаг_покупок[i]=false;}
   if(Флаг_продаж[i] == true && Bid > value-Подход_к_уровню*Point()){Alert("Подход цены к уровню на  ",Symbol());PlaySound("Подход к уровню.wav");Флаг_продаж[i]=false;}
  }
 return(0);
}

//+------------------------------------------------------------------+
void Уровень(int nomer,double price){
   string name="Уровень"+IntegerToString(nomer);
   if(ObjectFind(name)<0) ObjectCreate(name,OBJ_TREND,0,Time[0],price,Time[0]+длина,price);
      ObjectSet(name,OBJPROP_STYLE,STYLE_SOLID);
      ObjectSet(name,OBJPROP_RAY,false);
      ObjectSet(name,OBJPROP_COLOR,clrYellow);
}

Recommend