Индикаторы: Индикатор линии сопротивления

 

Индикатор линии сопротивления:

Строит линию сопротивления опираясь на два последних верхних фрактала.

Author: IURII TOKMAN

 
Очень просто, но полезно. Логично было бы объеденить поддержку и сопротивление в один индикатор.
 
Ugar:
Очень просто, но полезно. Логично было бы объеденить поддержку и сопротивление в один индикатор.

Изначально они были объединены, только почему-то после нескольких секунд роботы зависал терминал, и проц работал на все 100%.

А когда разделил проблемы ушли. И все стало нормально.

 
Хотелось бы иметь мультитаймфреймовые индикаторы такого рода. Допустим, работашь на М15, а линии видишь Н1.
 

вот вобщем на основе твоей идеи сделал наброски индюка который показывает сразу поддержку-сопротивление с 4х ТФ H1,H4,D1,W1

//+------------------------------------------------------------------+
//|                                                      Support.mq4 |
//|                                           Copyright © 2007, DKeN |
//|                                                  http://dken.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, DKeN"
#property link      "http://dken.biz"
#property indicator_chart_window
extern int g_Max = 100;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   ObjectCreate("Support_60", OBJ_TREND, 0,0,0,0,0);
   ObjectCreate("Support_240", OBJ_TREND, 0,0,0,0,0);
   ObjectCreate("Support_1440", OBJ_TREND, 0,0,0,0,0);
   ObjectCreate("Support_10080", OBJ_TREND, 0,0,0,0,0);
   
   ObjectCreate("Resist_60", OBJ_TREND, 0,0,0,0,0);
   ObjectCreate("Resist_240", OBJ_TREND, 0,0,0,0,0);
   ObjectCreate("Resist_1440", OBJ_TREND, 0,0,0,0,0);
   ObjectCreate("Resist_10080", OBJ_TREND, 0,0,0,0,0);
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   ObjectDelete("Support_60"); 
   ObjectDelete("Support_240"); 
   ObjectDelete("Support_1440"); 
   ObjectDelete("Support_10080"); 
   
   ObjectDelete("Resist_60"); 
   ObjectDelete("Resist_240"); 
   ObjectDelete("Resist_1440"); 
   ObjectDelete("Resist_10080"); 
   
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
//----
   draw_support(PERIOD_H1,Red);
   draw_support(PERIOD_H4,Green);
   draw_support(PERIOD_D1,Blue);
   draw_support(PERIOD_W1,Orange);
   
   draw_resist(PERIOD_H1,Red);
   draw_resist(PERIOD_H4,Green);
   draw_resist(PERIOD_D1,Blue);
   draw_resist(PERIOD_W1,Orange);
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
void draw_support(int iPeriod,color icolor){
  double F1=0, F3=0, F13;    // номера фракталов
  int    B1, B3, SR=0;               // номера баров
  string name="Support_"+iPeriod;
  
  while(F3==0)                       //поиск фракталов
  {
    F13=iFractals(NULL,iPeriod,MODE_UPPER,SR);
    if (F13!=0) 
    {
      if      (F1==0){B1=SR; F1=F13;}
      else if (F3==0){B3=SR; F3=F13;}
    }
    SR++; 
    if(SR>g_Max) break;
  }
    ObjectSet(name,OBJPROP_TIME1,iTime(NULL,iPeriod,B3));
    ObjectSet(name,OBJPROP_TIME2,iTime(NULL,iPeriod,B1));
    ObjectSet(name,OBJPROP_PRICE1,iHigh(NULL,iPeriod,B3));
    ObjectSet(name,OBJPROP_PRICE2,iHigh(NULL,iPeriod,B1));
    ObjectSet(name,OBJPROP_RAY,True);   
    ObjectSet(name,OBJPROP_COLOR,icolor);
}
void draw_resist(int iPeriod,color icolor){
  double F1=0, F3=0, F13;    // номера фракталов
  int    B1, B3, SR=0;               // номера баров
  string name="Resist_"+iPeriod;
  
  while(F3==0)                       //поиск фракталов
  {
    F13=iFractals(NULL,iPeriod,MODE_LOWER,SR);
    if (F13!=0) 
    {
      if      (F1==0){B1=SR; F1=F13;}
      else if (F3==0){B3=SR; F3=F13;}
    }
    SR++; 
    if(SR>g_Max) break;
  }
    ObjectSet(name,OBJPROP_TIME1,iTime(NULL,iPeriod,B3));
    ObjectSet(name,OBJPROP_TIME2,iTime(NULL,iPeriod,B1));
    ObjectSet(name,OBJPROP_PRICE1,iLow(NULL,iPeriod,B3));
    ObjectSet(name,OBJPROP_PRICE2,iLow(NULL,iPeriod,B1));
    ObjectSet(name,OBJPROP_RAY,True);   
    ObjectSet(name,OBJPROP_COLOR,icolor);
}
//к названиям функций прошу не придераться....знаю что наоборот должно быть)))
 
DKeN:

вот вобщем на основе твоей идеи сделал наброски индюка который показывает сразу поддержку-сопротивление с 4х ТФ H1,H4,D1,W1...

вот немного доработанный вариант
//+------------------------------------------------------------------+
//|                                                     Support2.mq4 |
//|                                           Copyright © 2007, DKeN |
//|                                                  http://dken.biz |
//|                                               modify by pva 2012 |
//+------------------------------------------------------------------+
/*изменена ширина у линий*/
/*исправлены названия функций на нормальные*/
//основная задача была в исправлении OBJPROP_TIME1 и OBJPROP_TIME2, чтобы использовался текущий TF
/*испрапвлено для H1, на остальных TF как раньше, доделаете сами если надо*/
/*  H4 максимум(минимум)должен быть нарисован с 3(4) часового бара, а не с первого, как в оргинале  
      |
  |   | | |
  | | | | |
    |   | |
        |
*/
#property copyright "Copyright © 2007, DKeN"
#property link      "http://dken.biz"
#property indicator_chart_window
extern int g_Max = 100;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   ObjectCreate("Поддержка_60", OBJ_TREND, 0,0,0,0,0);
   ObjectCreate("Поддержка_240", OBJ_TREND, 0,0,0,0,0);
   ObjectCreate("Поддержка_1440", OBJ_TREND, 0,0,0,0,0);
   ObjectCreate("Поддержка_10080", OBJ_TREND, 0,0,0,0,0);
   
   ObjectCreate("Сопротивление_60", OBJ_TREND, 0,0,0,0,0);
   ObjectCreate("Сопротивление_240", OBJ_TREND, 0,0,0,0,0);
   ObjectCreate("Сопротивление_1440", OBJ_TREND, 0,0,0,0,0);
   ObjectCreate("Сопротивление_10080", OBJ_TREND, 0,0,0,0,0);
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   ObjectDelete("Поддержка_60"); 
   ObjectDelete("Поддержка_240"); 
   ObjectDelete("Поддержка_1440"); 
   ObjectDelete("Поддержка_10080"); 
   
   ObjectDelete("Сопротивление_60"); 
   ObjectDelete("Сопротивление_240"); 
   ObjectDelete("Сопротивление_1440"); 
   ObjectDelete("Сопротивление_10080"); 
   
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
//----
   draw_support(PERIOD_H1,Red);
   draw_support(PERIOD_H4,Green);
   draw_support(PERIOD_D1,Blue);
   draw_support(PERIOD_W1,Orange);
   
   draw_resist(PERIOD_H1,Red);
   draw_resist(PERIOD_H4,Green);
   draw_resist(PERIOD_D1,Blue);
   draw_resist(PERIOD_W1,Orange);
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
void draw_support(int iPeriod,color icolor){
  double F1=0, F3=0, F13;    // номера фракталов
  int    B1, B3, SR=0;               // номера баров
  string name="Поддержка_"+iPeriod;
  
  while(F3==0)                       //поиск фракталов
  {
    F13=iFractals(NULL,iPeriod,MODE_LOWER,SR);
    if (F13!=0) 
    {
      if      (F1==0){B1=SR; F1=F13;}
      else if (F3==0){B3=SR; F3=F13;}
    }
    SR++; 
    if(SR>g_Max) break;
  }
///////////////=================
if (Period()==PERIOD_H1 && iPeriod != PERIOD_H1)
{
int BarsInH1 = 0;
switch(iPeriod)
  {
   //case PERIOD_H1: BarsInH1=1; break;
   case PERIOD_H4: BarsInH1=4; break;
   case PERIOD_D1: BarsInH1=24; break;
   case PERIOD_W1: BarsInH1=120; break;   
  } 
  datetime time1 = iTime(NULL,iPeriod,B3); //время левой цены периода iPeriod
  datetime time2 = iTime(NULL,iPeriod,B1); //время правой цены периода iPeriod
  int lBar = iBarShift(NULL,Period(),time1)-BarsInH1; //точка отсчета для iLowest
  int rBar = iBarShift(NULL,Period(),time2)-BarsInH1; //точка отсчета для iLowest
  int shift1 = iLowest(NULL,Period(),MODE_LOW,BarsInH1,lBar);
  int shift2 = iLowest(NULL,Period(),MODE_LOW,BarsInH1,rBar); 
    ObjectSet(name,OBJPROP_TIME1,iTime(NULL,Period(),shift1));
    ObjectSet(name,OBJPROP_TIME2,iTime(NULL,Period(),shift2));
} else {
//////////////////===================
    ObjectSet(name,OBJPROP_TIME1,iTime(NULL,iPeriod,B3));
    ObjectSet(name,OBJPROP_TIME2,iTime(NULL,iPeriod,B1));
} //!!!
    ObjectSet(name,OBJPROP_PRICE1,iLow(NULL,iPeriod,B3));
    ObjectSet(name,OBJPROP_PRICE2,iLow(NULL,iPeriod,B1));
    ObjectSet(name,OBJPROP_RAY,True);       
    ObjectSet(name,OBJPROP_COLOR,icolor);
switch(iPeriod)
  {
   case PERIOD_H1: ObjectSet(name,OBJPROP_WIDTH,1);   break;
   case PERIOD_H4: ObjectSet(name,OBJPROP_WIDTH,2);   break;
   case PERIOD_D1: ObjectSet(name,OBJPROP_WIDTH,3);   break;
   case PERIOD_W1: ObjectSet(name,OBJPROP_WIDTH,4);   break;   
  }
}
void draw_resist(int iPeriod,color icolor){
  double F1=0, F3=0, F13;    // номера фракталов
  int    B1, B3, SR=0;               // номера баров
  string name="Сопротивление_"+iPeriod;
    
  while(F3==0)                       //поиск фракталов
  {
    F13=iFractals(NULL,iPeriod,MODE_UPPER,SR);
    if (F13!=0) 
    {
      if      (F1==0){B1=SR; F1=F13;}
      else if (F3==0){B3=SR; F3=F13;}
    }
    SR++; 
    if(SR>g_Max) break;  
  }
///////////////=================
if (Period()==PERIOD_H1 && iPeriod != PERIOD_H1)
{
int BarsInH1 = 0;
switch(iPeriod)
  {
   //case PERIOD_H1: BarsInH1=1; break;
   case PERIOD_H4: BarsInH1=4; break;
   case PERIOD_D1: BarsInH1=24; break;
   case PERIOD_W1: BarsInH1=120; break;   
  } 
  datetime time1 = iTime(NULL,iPeriod,B3); //время левой цены периода iPeriod
  datetime time2 = iTime(NULL,iPeriod,B1); //время правой цены периода iPeriod
  int lBar = iBarShift(NULL,Period(),time1)-BarsInH1; //точка отсчета для iHighest
  int rBar = iBarShift(NULL,Period(),time2)-BarsInH1; //точка отсчета для iHighest
  int shift1 = iHighest(NULL,Period(),MODE_HIGH,BarsInH1,lBar);
  int shift2 = iHighest(NULL,Period(),MODE_HIGH,BarsInH1,rBar);
    ObjectSet(name,OBJPROP_TIME1,iTime(NULL,Period(),shift1));
    ObjectSet(name,OBJPROP_TIME2,iTime(NULL,Period(),shift2));
} else {
//////////////////===================
    ObjectSet(name,OBJPROP_TIME1,iTime(NULL,iPeriod,B3));
    ObjectSet(name,OBJPROP_TIME2,iTime(NULL,iPeriod,B1));
} //!!!  
    ObjectSet(name,OBJPROP_PRICE1,iHigh(NULL,iPeriod,B3));
    ObjectSet(name,OBJPROP_PRICE2,iHigh(NULL,iPeriod,B1));
    ObjectSet(name,OBJPROP_RAY,True);   
    ObjectSet(name,OBJPROP_COLOR,icolor);
switch(iPeriod)
  {
   case PERIOD_H1: ObjectSet(name,OBJPROP_WIDTH,1);   break;
   case PERIOD_H4: ObjectSet(name,OBJPROP_WIDTH,2);   break;
   case PERIOD_D1: ObjectSet(name,OBJPROP_WIDTH,3);   break;
   case PERIOD_W1: ObjectSet(name,OBJPROP_WIDTH,4);   break;   
  }
}

результат (тонкими линиями старая версия)

Причина обращения: