//+---------------------------------------------------------------------------+ //| mv-i-TAACH_1_0.mq4 | //| Максим Василенко В. MaxV42 | //| http:// | //| Индикатор работает по стратегии "ТААЧ". | //| Версия 1.0 от 20.12.2009: | //| | //+---------------------------------------------------------------------------+ #property copyright "Максим Василенко В. MaxV42" #property link "http://" //+---------------------------------------------------------------------------+ #property indicator_chart_window #property indicator_buffers 4 #property indicator_color1 Blue #property indicator_color2 Red #property indicator_width1 1 #property indicator_width2 1 #property indicator_color3 Blue #property indicator_color4 Red #property indicator_width3 1 #property indicator_width4 1 //+---------------------------------------------------------------------------+ extern string Ind_Coment1= "--- Параметры младшего таймфрейма ---"; extern bool ShowFractals_LowerTF = false; // Вкл/выкл значков фракталов extern bool OnAlert_Pitchfork_LowerTF = false; // Вкл/выкл сигнала при выявлении нового канала extern int nPitchfork_Upper_LowerTF = 2; // Количество выводимых восходящих "Вил Эндрюса" extern int nPitchfork_Lower_LowerTF = 2; // Количество выводимых нисходящих "Вил Эндрюса" extern bool ShowPitchfork_LowerTF = true; // Вкл/выкл "Вил Эндрюса" младшего таймфрейма extern string Ind_Coment2= "--- Параметры старшего таймфрейма ---"; extern int TF_Upper = 1440; // Старший таймфрейм extern bool ShowFractals_UpperTF = false; // Вкл/выкл значков фракталов extern bool OnAlert_Pitchfork_UpperTF = false; // Вкл/выкл сигнала при выявлении нового канала extern int nPitchfork_Upper_UpperTF = 1; // Количество выводимых восходящих "Вил Эндрюса" extern int nPitchfork_Lower_UpperTF = 1; // Количество выводимых нисходящих "Вил Эндрюса" extern bool ShowPitchfork_UpperTF = true; // Вкл/выкл "Вил Эндрюса" старшего таймфрейма //+---------------------------------------------------------------------------+ // глобальные переменные int nBars_LowerTF = 0, // кол-во баров младшего тафмфрейма nBars_UpperTF = 0; // кол-во баров старшего тафмфрейма int QntPitchfork_Upper_LowerTF= 0; // Количество уже отрисованных восходящих "Вил Эндрюса" int QntPitchfork_Lower_LowerTF= 0; // Количество уже отрисованных нисходящих "Вил Эндрюса" int QntPitchfork_Upper_UpperTF= 0; // Количество уже отрисованных восходящих "Вил Эндрюса" int QntPitchfork_Lower_UpperTF= 0; // Количество уже отрисованных нисходящих "Вил Эндрюса" //----- buffers double ExtMapBuffer1[]; double ExtMapBuffer2[]; double ExtMapBuffer3[]; double ExtMapBuffer4[]; //+---------------------------------------------------------------------------+ void init() { // Custom indicator initialization function int Qnt=ObjectsTotal(); // ----- Indicators Properties SetIndexStyle(0,DRAW_ARROW); SetIndexArrow(0,119); SetIndexBuffer(0,ExtMapBuffer1); SetIndexEmptyValue(0,0.0); SetIndexStyle(1,DRAW_ARROW); SetIndexArrow(1,119); SetIndexBuffer(1,ExtMapBuffer2); SetIndexEmptyValue(1,0.0); SetIndexStyle(2,DRAW_ARROW); SetIndexArrow(2,117); SetIndexBuffer(2,ExtMapBuffer3); SetIndexEmptyValue(2,0.0); SetIndexStyle(3,DRAW_ARROW); SetIndexArrow(3,117); SetIndexBuffer(3,ExtMapBuffer4); SetIndexEmptyValue(3,0.0); // ----- Name for DataWindow and indicator subwindow label IndicatorShortName("mv-i-TAACH_1_0"); SetIndexLabel(0,"FractalsUp.LowerTF"); SetIndexLabel(1,"FractalsDown.LowerTF"); SetIndexLabel(2,"FractalsUp.UpperTF"); SetIndexLabel(3,"FractalsDown.UpperTF"); return; } //+---------------------------------------------------------------------------+ void deinit() { // Custom indicator deinitialization function int Qnt=ObjectsTotal(); // ----- Удаляем трендовые линии for (int i=0; i=0) { ObjectDelete(ObjectName(i)); // направленные вверх i--; continue; } if(StringFind(ObjectName(i),"Pitchfork_Lower",0)>=0) { ObjectDelete(ObjectName(i)); // направленные вниз i--; continue; } if(i>=ObjectsTotal()) break; } return; } //+---------------------------------------------------------------------------+ void start() { // Custom indicator iteration function int counted_bars=IndicatorCounted(); int limit; int Spred=(int)MarketInfo(Symbol(),MODE_SPREAD); double Fractals_Upper=0,Fractals_Lower=0; // ----- Проверка внешних параметров индикатора if(!CheckParameters()) return; // ----- новый бар не появился if(!isNewBar_LowerTF()) return; // ----- Последний посчитанный бар будет пересчитан if (counted_bars>0) counted_bars--; limit=Bars-counted_bars; if(limit>500) limit=500; // ----- Основной цикл for (int i=limit; i>=0; i--) { //--------------------------------------------------------- 1 -- Fractals_Upper=iFractals(NULL,0,MODE_UPPER,i); Fractals_Lower=iFractals(NULL,0,MODE_LOWER,i); if(Fractals_Upper>0) { // ----- здесь нужно запустить функцию отрисовки нисходящих "Вил Эндрюса" if(ShowPitchfork_LowerTF) { if(DrawLowerPitchfork(i, 0)) { // ----- здесь алерт if(OnAlert_Pitchfork_LowerTF && i==0) { Alert(Symbol(),Period()," Нисходящие Вилы Эндрюса! ",TimeToStr(Time[i],TIME_DATE|TIME_SECONDS)); } } } // ----- отображаем вракталы младшего таймфрейма if(ShowFractals_LowerTF) { ExtMapBuffer1[i]=Fractals_Upper+Spred*Point; } } if(Fractals_Lower>0) { // ----- здесь нужно запустить функцию отрисовки восходящих "Вил Эндрюса" if(ShowPitchfork_LowerTF) { if(DrawUpperPitchfork(i, 0)) { // ----- здесь алерт if(OnAlert_Pitchfork_LowerTF && i==0) { Alert(Symbol(),Period()," Восходящие Вилы Эндрюса! ",TimeToStr(Time[i],TIME_DATE|TIME_SECONDS)); } } } // ----- отображаем вракталы младшего таймфрейма if(ShowFractals_LowerTF) { ExtMapBuffer2[i]=Fractals_Lower-Spred*Point; } } //--------------------------------------------------------- 2 -- Fractals_Upper=0;Fractals_Lower=0; //--------------------------------------------------------- 3 -- // ----- появился новый бар старшего таймфрейма if(isNewBar_UpperTF(Time[i])) { Fractals_Upper=iFractals(NULL,TF_Upper,MODE_UPPER,nBars_UpperTF); Fractals_Lower=iFractals(NULL,TF_Upper,MODE_LOWER,nBars_UpperTF); if(Fractals_Upper>0) { // ----- здесь нужно запустить функцию отрисовки нисходящих "Вил Эндрюса" if(ShowPitchfork_UpperTF) { if(DrawLowerPitchfork(nBars_UpperTF, TF_Upper)) { // ----- здесь алерт if(OnAlert_Pitchfork_UpperTF && nBars_UpperTF==0) { Alert(Symbol(),Period()," Нисходящие Вилы Эндрюса! ",TimeToStr(Time[i],TIME_DATE|TIME_SECONDS)); } } } // ----- отображаем вракталы старшего таймфрейма if(ShowFractals_UpperTF) { ExtMapBuffer3[iBarShift(NULL,0,iTime(NULL,TF_Upper,nBars_UpperTF),false)]=Fractals_Upper+Spred*Point; } } if(Fractals_Lower>0) { // ----- здесь нужно запустить функцию отрисовки восходящих "Вил Эндрюса" if(ShowPitchfork_UpperTF) { if(DrawUpperPitchfork(nBars_UpperTF, TF_Upper)) { // ----- здесь алерт if(OnAlert_Pitchfork_UpperTF && nBars_UpperTF==0) { Alert(Symbol(),Period()," Восходящие Вилы Эндрюса! ",TimeToStr(Time[i],TIME_DATE|TIME_SECONDS)); } } } // ----- отображаем вракталы старшего таймфрейма if(ShowFractals_UpperTF) { ExtMapBuffer4[iBarShift(NULL,0,iTime(NULL,TF_Upper,nBars_UpperTF),false)]=Fractals_Lower-Spred*Point; } } } } return; } //+---------------------------------------------------------------------------+ bool isNewBar_LowerTF() { // Функция возвращает true, если появиться новый бар на младшем тйамфрейме if(nBars_LowerTF!=Bars) { nBars_LowerTF=Bars; return(true); } return(false); } //+---------------------------------------------------------------------------+ bool isNewBar_UpperTF(datetime DateTime_) { // Функция возвращает true, если появиться новый бар на старшем тйамфрейме if(nBars_UpperTF!=iBarShift(NULL, TF_Upper, DateTime_, false)) { nBars_UpperTF=iBarShift(NULL, TF_Upper, DateTime_, false); return(true); } return(false); } //+---------------------------------------------------------------------------+ bool DrawUpperPitchfork(int nBar, int TF=0) { // Функция определяет и рисует восходящие "Вилы Эндрюса" double Fractals_Upper=0,Fractals_Lower=0; string mFractals[3][3]; int i,j=0; //--------------------------------------------------------- 1 -- // ----- определяем опорные точки for (i=nBar; i0) { mFractals[j][0]=TimeToStr(iTime(NULL,TF,i),TIME_DATE|TIME_MINUTES); mFractals[j][1]=DoubleToStr(Fractals_Lower,Digits); mFractals[j][2]=(string)-1; j++; } if(j<3 && Fractals_Upper>0) { mFractals[j][0]=TimeToStr(iTime(NULL,TF,i),TIME_DATE|TIME_MINUTES); mFractals[j][1]=DoubleToStr(Fractals_Upper,Digits); mFractals[j][2]=(string)1; j++; } if(j>3) break; } //--------------------------------------------------------- 2 -- // ------ проверяем последовтельность опорных точек: MODE_LOWER->MODE_UPPER->MODE_LOWER if(StrToDouble(mFractals[0][2])==-1 && StrToDouble(mFractals[1][2])==1 && StrToDouble(mFractals[2][2])==-1) { //--------------------------------------------------------- 1 -- // ----- младший таймфрейм if(TF==0) { if(QntPitchfork_Upper_LowerTF=nPitchfork_Upper_LowerTF) { // кол-во вил превышено, изменяем параметры первых вил for (i=0; i<=QntPitchfork_Upper_LowerTF-2; i++) { ObjectSet("Pitchfork_Upper_LowerTF"+(string)i,OBJPROP_TIME1,ObjectGet("Pitchfork_Upper_LowerTF"+(string)(i+1),OBJPROP_TIME1)); ObjectSet("Pitchfork_Upper_LowerTF"+(string)i,OBJPROP_PRICE1,ObjectGet("Pitchfork_Upper_LowerTF"+(string)(i+1),OBJPROP_PRICE1)); ObjectSet("Pitchfork_Upper_LowerTF"+(string)i,OBJPROP_TIME2,ObjectGet("Pitchfork_Upper_LowerTF"+(string)(i+1),OBJPROP_TIME2)); ObjectSet("Pitchfork_Upper_LowerTF"+(string)i,OBJPROP_PRICE2,ObjectGet("Pitchfork_Upper_LowerTF"+(string)(i+1),OBJPROP_PRICE2)); ObjectSet("Pitchfork_Upper_LowerTF"+(string)i,OBJPROP_TIME3,ObjectGet("Pitchfork_Upper_LowerTF"+(string)(i+1),OBJPROP_TIME3)); ObjectSet("Pitchfork_Upper_LowerTF"+(string)i,OBJPROP_PRICE3,ObjectGet("Pitchfork_Upper_LowerTF"+(string)(i+1),OBJPROP_PRICE3)); } ObjectSet("Pitchfork_Upper_LowerTF"+(string)(QntPitchfork_Upper_LowerTF-1),OBJPROP_TIME1,StrToTime(mFractals[2][0])); ObjectSet("Pitchfork_Upper_LowerTF"+(string)(QntPitchfork_Upper_LowerTF-1),OBJPROP_PRICE1,StrToDouble(mFractals[2][1])); ObjectSet("Pitchfork_Upper_LowerTF"+(string)(QntPitchfork_Upper_LowerTF-1),OBJPROP_TIME2,StrToTime(mFractals[1][0])); ObjectSet("Pitchfork_Upper_LowerTF"+(string)(QntPitchfork_Upper_LowerTF-1),OBJPROP_PRICE2,StrToDouble(mFractals[1][1])); ObjectSet("Pitchfork_Upper_LowerTF"+(string)(QntPitchfork_Upper_LowerTF-1),OBJPROP_TIME3,StrToTime(mFractals[0][0])); ObjectSet("Pitchfork_Upper_LowerTF"+(string)(QntPitchfork_Upper_LowerTF-1),OBJPROP_PRICE3,StrToDouble(mFractals[0][1])); ObjectSet("Pitchfork_Upper_LowerTF"+(string)(QntPitchfork_Upper_LowerTF-1),OBJPROP_STYLE,STYLE_SOLID); } } //--------------------------------------------------------- 2 -- // ----- старший таймфрейм if(TF!=0) { if(QntPitchfork_Upper_UpperTF=nPitchfork_Upper_UpperTF) { // кол-во вил превышено, изменяем параметры первых вил for (i=0; i<=QntPitchfork_Upper_UpperTF-2; i++) { ObjectSet("Pitchfork_Upper_UpperTF"+(string)i,OBJPROP_TIME1,ObjectGet("Pitchfork_Upper_UpperTF"+(string)(i+1),OBJPROP_TIME1)); ObjectSet("Pitchfork_Upper_UpperTF"+(string)i,OBJPROP_PRICE1,ObjectGet("Pitchfork_Upper_UpperTF"+(string)(i+1),OBJPROP_PRICE1)); ObjectSet("Pitchfork_Upper_UpperTF"+(string)i,OBJPROP_TIME2,ObjectGet("Pitchfork_Upper_UpperTF"+(string)(i+1),OBJPROP_TIME2)); ObjectSet("Pitchfork_Upper_UpperTF"+(string)i,OBJPROP_PRICE2,ObjectGet("Pitchfork_Upper_UpperTF"+(string)(i+1),OBJPROP_PRICE2)); ObjectSet("Pitchfork_Upper_UpperTF"+(string)i,OBJPROP_TIME3,ObjectGet("Pitchfork_Upper_UpperTF"+(string)(i+1),OBJPROP_TIME3)); ObjectSet("Pitchfork_Upper_UpperTF"+(string)i,OBJPROP_PRICE3,ObjectGet("Pitchfork_Upper_UpperTF"+(string)(i+1),OBJPROP_PRICE3)); } ObjectSet("Pitchfork_Upper_UpperTF"+(string)(QntPitchfork_Upper_UpperTF-1),OBJPROP_TIME1,StrToTime(mFractals[2][0])); ObjectSet("Pitchfork_Upper_UpperTF"+(string)(QntPitchfork_Upper_UpperTF-1),OBJPROP_PRICE1,StrToDouble(mFractals[2][1])); ObjectSet("Pitchfork_Upper_UpperTF"+(string)(QntPitchfork_Upper_UpperTF-1),OBJPROP_TIME2,StrToTime(mFractals[1][0])); ObjectSet("Pitchfork_Upper_UpperTF"+(string)(QntPitchfork_Upper_UpperTF-1),OBJPROP_PRICE2,StrToDouble(mFractals[1][1])); ObjectSet("Pitchfork_Upper_UpperTF"+(string)(QntPitchfork_Upper_UpperTF-1),OBJPROP_TIME3,StrToTime(mFractals[0][0])); ObjectSet("Pitchfork_Upper_UpperTF"+(string)(QntPitchfork_Upper_UpperTF-1),OBJPROP_PRICE3,StrToDouble(mFractals[0][1])); ObjectSet("Pitchfork_Upper_UpperTF"+(string)(QntPitchfork_Upper_UpperTF-1),OBJPROP_STYLE,STYLE_SOLID); } } return(true); } return(false); } //+---------------------------------------------------------------------------+ bool DrawLowerPitchfork(int nBar, int TF=0) { // Функция определяет и рисует нисходящие "Вилы Эндрюса" double Fractals_Upper=0,Fractals_Lower=0; string mFractals[3][3]; int i,j=0; //--------------------------------------------------------- 1 -- // ----- определяем опорные точки for (i=nBar; i0) { mFractals[j][0]=TimeToStr(iTime(NULL,TF,i),TIME_DATE|TIME_MINUTES); mFractals[j][1]=DoubleToStr(Fractals_Upper,Digits); mFractals[j][2]=(string)1; j++; } if(j<3 && Fractals_Lower>0) { mFractals[j][0]=TimeToStr(iTime(NULL,TF,i),TIME_DATE|TIME_MINUTES); mFractals[j][1]=DoubleToStr(Fractals_Lower,Digits); mFractals[j][2]=(string)-1; j++; } if(j>3) break; } //--------------------------------------------------------- 2 -- // ------ проверяем последовтельность опорных точек: MODE_UPPER->MODE_LOWER->MODE_UPPER if(StrToDouble(mFractals[0][2])==1 && StrToDouble(mFractals[1][2])==-1 && StrToDouble(mFractals[2][2])==1) { //--------------------------------------------------------- 1 -- // ----- младший таймфрейм if(TF==0) { if(QntPitchfork_Lower_LowerTF=nPitchfork_Lower_LowerTF) { // кол-во вил превышено, изменяем параметры первых вил for (i=0; i<=QntPitchfork_Lower_LowerTF-2; i++) { ObjectSet("Pitchfork_Lower_LowerTF"+(string)i,OBJPROP_TIME1,ObjectGet("Pitchfork_Lower_LowerTF"+(string)(i+1),OBJPROP_TIME1)); ObjectSet("Pitchfork_Lower_LowerTF"+(string)i,OBJPROP_PRICE1,ObjectGet("Pitchfork_Lower_LowerTF"+(string)(i+1),OBJPROP_PRICE1)); ObjectSet("Pitchfork_Lower_LowerTF"+(string)i,OBJPROP_TIME2,ObjectGet("Pitchfork_Lower_LowerTF"+(string)(i+1),OBJPROP_TIME2)); ObjectSet("Pitchfork_Lower_LowerTF"+(string)i,OBJPROP_PRICE2,ObjectGet("Pitchfork_Lower_LowerTF"+(string)(i+1),OBJPROP_PRICE2)); ObjectSet("Pitchfork_Lower_LowerTF"+(string)i,OBJPROP_TIME3,ObjectGet("Pitchfork_Lower_LowerTF"+(string)(i+1),OBJPROP_TIME3)); ObjectSet("Pitchfork_Lower_LowerTF"+(string)i,OBJPROP_PRICE3,ObjectGet("Pitchfork_Lower_LowerTF"+(string)(i+1),OBJPROP_PRICE3)); } ObjectSet("Pitchfork_Lower_LowerTF"+(string)(QntPitchfork_Lower_LowerTF-1),OBJPROP_TIME1,StrToTime(mFractals[2][0])); ObjectSet("Pitchfork_Lower_LowerTF"+(string)(QntPitchfork_Lower_LowerTF-1),OBJPROP_PRICE1,StrToDouble(mFractals[2][1])); ObjectSet("Pitchfork_Lower_LowerTF"+(string)(QntPitchfork_Lower_LowerTF-1),OBJPROP_TIME2,StrToTime(mFractals[1][0])); ObjectSet("Pitchfork_Lower_LowerTF"+(string)(QntPitchfork_Lower_LowerTF-1),OBJPROP_PRICE2,StrToDouble(mFractals[1][1])); ObjectSet("Pitchfork_Lower_LowerTF"+(string)(QntPitchfork_Lower_LowerTF-1),OBJPROP_TIME3,StrToTime(mFractals[0][0])); ObjectSet("Pitchfork_Lower_LowerTF"+(string)(QntPitchfork_Lower_LowerTF-1),OBJPROP_PRICE3,StrToDouble(mFractals[0][1])); ObjectSet("Pitchfork_Lower_LowerTF"+(string)(QntPitchfork_Lower_LowerTF-1),OBJPROP_STYLE,STYLE_SOLID); } } //--------------------------------------------------------- 2 -- // ----- старший таймфрейм if(TF!=0) { if(QntPitchfork_Lower_UpperTF=nPitchfork_Lower_UpperTF) { // кол-во вил превышено, изменяем параметры первых вил for (i=0; i<=QntPitchfork_Lower_UpperTF-2; i++) { ObjectSet("Pitchfork_Lower_UpperTF"+(string)i,OBJPROP_TIME1,ObjectGet("Pitchfork_Lower_UpperTF"+(string)(i+1),OBJPROP_TIME1)); ObjectSet("Pitchfork_Lower_UpperTF"+(string)i,OBJPROP_PRICE1,ObjectGet("Pitchfork_Lower_UpperTF"+(string)(i+1),OBJPROP_PRICE1)); ObjectSet("Pitchfork_Lower_UpperTF"+(string)i,OBJPROP_TIME2,ObjectGet("Pitchfork_Lower_UpperTF"+(string)(i+1),OBJPROP_TIME2)); ObjectSet("Pitchfork_Lower_UpperTF"+(string)i,OBJPROP_PRICE2,ObjectGet("Pitchfork_Lower_UpperTF"+(string)(i+1),OBJPROP_PRICE2)); ObjectSet("Pitchfork_Lower_UpperTF"+(string)i,OBJPROP_TIME3,ObjectGet("Pitchfork_Lower_UpperTF"+(string)(i+1),OBJPROP_TIME3)); ObjectSet("Pitchfork_Lower_UpperTF"+(string)i,OBJPROP_PRICE3,ObjectGet("Pitchfork_Lower_UpperTF"+(string)(i+1),OBJPROP_PRICE3)); } ObjectSet("Pitchfork_Lower_UpperTF"+(string)(QntPitchfork_Lower_UpperTF-1),OBJPROP_TIME1,StrToTime(mFractals[2][0])); ObjectSet("Pitchfork_Lower_UpperTF"+(string)(QntPitchfork_Lower_UpperTF-1),OBJPROP_PRICE1,StrToDouble(mFractals[2][1])); ObjectSet("Pitchfork_Lower_UpperTF"+(string)(QntPitchfork_Lower_UpperTF-1),OBJPROP_TIME2,StrToTime(mFractals[1][0])); ObjectSet("Pitchfork_Lower_UpperTF"+(string)(QntPitchfork_Lower_UpperTF-1),OBJPROP_PRICE2,StrToDouble(mFractals[1][1])); ObjectSet("Pitchfork_Lower_UpperTF"+(string)(QntPitchfork_Lower_UpperTF-1),OBJPROP_TIME3,StrToTime(mFractals[0][0])); ObjectSet("Pitchfork_Lower_UpperTF"+(string)(QntPitchfork_Lower_UpperTF-1),OBJPROP_PRICE3,StrToDouble(mFractals[0][1])); ObjectSet("Pitchfork_Lower_UpperTF"+(string)(QntPitchfork_Lower_UpperTF-1),OBJPROP_STYLE,STYLE_SOLID); } } return(true); } return(false); } //+---------------------------------------------------------------------------+ bool CheckParameters() { // Функция проверки внешних параметров индикатора string TextMessage; if(nPitchfork_Upper_LowerTF<1 || nPitchfork_Lower_LowerTF<1 || nPitchfork_Upper_UpperTF<1 || nPitchfork_Lower_UpperTF<1 ) { TextMessage="Неверные значения внешних параметров индикатора!"+ "Количество вил не могет быть <(меньше) 1"; Alert(TextMessage); return(false); } if(TF_Upper<=Period()) { TextMessage="Неверные значения внешних параметров индикатора!"+ "Значение старшего таймфрейма должно быть >(больше) текущего!"; Alert(TextMessage); return(false); } return(true); }