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]); } }