Navigation:Home > Content >

#_fx-impuls_&_trend.mq4

Time: 2014-04-24 | Download file:#_fx-impuls_&_trend.mq4

//eevviill comments to video
/*
- Задача добавить стрелки на подвальный индикатор и на основной. Буферные стрелки и как объёкты.
- Условия это пересечния главной линии 2 горизонтальных.
- Сначало буферные стрелки.
- Индикатор уже имеет 3 бефера. Нужно добавить ещё 2. Копирую с заготовки. 
- Добавим 2 буфера
- наши стрелки будут в буферах up down
- теперь установим хи в Инит
- поскольку у нас уже есть 3 буфера, то наши будут под номерами 3,4
- теперь скопируем настройки стрелок
- отделим настройки для красоты
- сука!
- сука!
- теперь подправим названия для кода стрелок(вид)
- теперь цвет и толщина
- сука!
- теперь можно заполнить буфера данными
- ищём главный for и перед его закрывающей } считаем стрелки
- видим что первый буфер это наша главная линия(по цвету)
- нижняя линия это второй буфер, видно потому что значение у него с минусом
- шо то стрелки большие
- условие было Если главная линия больше нижней И главная линия на прошлом баре меньше=стрелка вверх
- для стрелки вниз аналогично
- перебор баров с начала до конца. Прийдётся подправлять условия.
- сука!
- теперь гуд.
- теперь на нужны стрелки на основном графике. Копирую заготовку. Стрелки как объекты рисования.
- и в денинт чистку стрелок добавить
- теперь рисуем стрелки
- в функции написано что делать(вид) если стрелка вверх или вниз
- ГУД!
*/

#property description "edited2 by eevviill"
#property description "arrows,build 600+,compile"


#property indicator_separate_window
#property indicator_buffers 5
#property indicator_color1 clrMediumSeaGreen
#property indicator_color2 clrMediumVioletRed
#property indicator_color3 clrMediumVioletRed

extern string emp0 = "/////////////main settings////////////";
extern int period_1 = 4;
extern int period_2 = 49;
extern double Hlines_level = 0.07;
extern int Bars_to_count = 500;

extern string emp1 = "/////////////arrows settings////////////";
extern int arrow_code_up = 233;
extern int arrow_code_down = 234;
extern color arrow_color_up = clrLime;
extern color arrow_color_down = clrRed;
extern int arrows_width = 1;
string identif = "arrows_ddra";



 double up_arr[];//!
 double down_arr[];//!
double main_line_buf[];
double line2_buf[];
double line1_buf[];

////////////////////////////////////////////////////////////
void OnInit() 
{
   SetIndexStyle(0, DRAW_LINE);
   SetIndexBuffer(0, main_line_buf);
   SetIndexStyle(1, DRAW_LINE);
   SetIndexBuffer(1, line2_buf);
   SetIndexStyle(2, DRAW_LINE);
   SetIndexBuffer(2, line1_buf);
   
   
    SetIndexBuffer(3,up_arr);
 SetIndexStyle(3,DRAW_ARROW,EMPTY,arrows_width,arrow_color_up);
 SetIndexArrow(3,arrow_code_up);
 SetIndexLabel(3,"UP arrow");

 SetIndexBuffer(4,down_arr);
 SetIndexStyle(4,DRAW_ARROW,EMPTY,arrows_width,arrow_color_down);
 SetIndexArrow(4,arrow_code_down);
 SetIndexLabel(4,"DOWN arrow");
   
   
   
   
 
}

//////////////////////////////////////////////////
void OnDeinit(const int reason) 
{
 string name_delete;
 for(int i=ObjectsTotal()-1;i>=0;i--)
 {
 name_delete=ObjectName(i);
 if(StringFind(name_delete,identif)!=-1) ObjectDelete(name_delete);
 }

   
}

////////////////////////////////////////////////////
int OnCalculate(const int rates_total,const int prev_calculated,const datetime &time[],const double &open[],const double &high[],
                const double &low[],const double &close[],const long &tick_volume[],const long &volume[],const int &spread[])
  {
  
   int ind_counted_0 = prev_calculated;
   double ma = 0;
   double mathExp = 0;
   if (ind_counted_0 < 0) return (-1);
   int x = rates_total - ind_counted_0;
   if (x > Bars_to_count) x = Bars_to_count;
   if (x > rates_total - period_2 - 1) x = rates_total - period_2 - 1;
 
   for (int i = 0; i <= x+1; i++) 
   {
      ma = 100.0 * (iMA(NULL, 0, period_1, 0, MODE_LWMA, PRICE_TYPICAL, i) - iMA(NULL, 0, period_2, 0, MODE_LWMA, PRICE_TYPICAL, i)) * iATR(NULL, 0, period_1,
         i) / iMA(NULL, 0, period_2, 0, MODE_LWMA, PRICE_TYPICAL, i) / iATR(NULL, 0, period_2, i);
      mathExp = (MathExp(2.0 * ma) - 1.0) / (MathExp(2.0 * ma) + 1.0);
      main_line_buf[i] = mathExp;
      line2_buf[i] = -Hlines_level;//!
      line1_buf[i] = Hlines_level;
      
      
      //arrows
      
      //del
      if(i==1) 
      {
      up_arr[i-1]=EMPTY_VALUE;
      down_arr[i-1]=EMPTY_VALUE; 
       string name = identif+string(Time[i-1])+"arrows";
       if(ObjectFind(name)!=-1) ObjectDelete(name);
      }
      
      //up arr
      
      if  (i>0 && main_line_buf[i-1]>line1_buf[i-1] && main_line_buf[i]<=line1_buf[i])
      {
      up_arr[i-1]=line1_buf[i-1];
      
      drawArrow(i-1,1);
      }
      //down arr
     
      if  (i>0 && main_line_buf[i-1]=line2_buf[i]) 
      {
      down_arr[i-1]=line2_buf[i-1];
      
      drawArrow(i-1,-1);
      }
      
      
      
   }
   return (rates_total);
}


//func
/////////////////////////////////////////////////////////////////////////
void drawArrow(int i,int way)
{
   string name = identif+string(Time[i])+"arrows";

   

      if(ObjectFind(0,name)==-1) ObjectCreate(0,name,OBJ_ARROW,0,Time[i],0);
         ObjectSetInteger(0,name,OBJPROP_WIDTH,arrows_width);
         
         if (way==1)
         {
         ObjectSetInteger(0,name,OBJPROP_ARROWCODE,arrow_code_up);
         ObjectSetInteger(0,name,OBJPROP_COLOR,arrow_color_up);
         ObjectSetInteger(0,name,OBJPROP_ANCHOR,ANCHOR_TOP);
         ObjectSetDouble(0,name,OBJPROP_PRICE1,Low[i]);
         }
         else  
         if(way==-1)
         {
         ObjectSetInteger(0,name,OBJPROP_ARROWCODE,arrow_code_down);
         ObjectSetInteger(0,name,OBJPROP_COLOR,arrow_color_down);
         ObjectSetInteger(0,name,OBJPROP_ANCHOR,ANCHOR_BOTTOM);
         ObjectSetDouble(0,name,OBJPROP_PRICE1,High[i]);
         }
      
         
}

Recommend