//+---------------------------------------------------------------------------+ //| mv-i-TAACH_2_0.mq4 | //| Максим Василенко В. MaxV42 | //| http:// | //| Индикатор работает по стратегии "ТААЧ". | //+---------------------------------------------------------------------------+ //| Версия 2.0 от 27.12.2009 | //| Добавлено: | //| - построение каналов по методу ТААЧ. | //+---------------------------------------------------------------------------+ //| Версия 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 = false; // Вкл/выкл "Вил Эндрюса" младшего таймфрейма extern string Ind_Coment2="--- Параметры старшего таймфрейма ---"; extern int TF_Upper = 240; // Старший таймфрейм 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 = false; // Вкл/выкл "Вил Эндрюса" старшего таймфрейма //+---------------------------------------------------------------------------+ // глобальные переменные 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; // Количество уже отрисованных нисходящих "Вил Эндрюса" //+---------------------------------------------------------------------------+ extern string Ind_Coment3="--- Параметры отображения каналов ---"; extern bool ShowChannels = true; // Вкл/выкл алгоритма расчета каналов extern bool ShowChannels_LowerTF = true; // Вкл/выкл каналов младшего таймфрейма extern bool ShowChannels_UpperTF = true; // Вкл/выкл каналов старшего таймфрейма extern int nChannels_LowerTF = 2; // кол-во каналов младшего тафмфрейма extern int nChannels_UpperTF = 1; // кол-во каналов старшего тафмфрейма extern color Channels_Color0 = DodgerBlue; // Цвет 0 канала extern color Channels_Color1 = Green; // Цвет 1 канала extern color Channels_Color2 = Magenta; // Цвет 2 канала extern color Channels_Color3 = Peru; // Цвет 3 канала extern color Channels_Color4 = Black; // Цвет остальных каналов //+---------------------------------------------------------------------------+ // глобальные переменные int QntChannels_LowerTF = 0, // кол-во уже отрисованных каналов младшего тафмфрейма QntChannels_UpperTF = 0; // кол-во уже отрисованных каналов старшего тафмфрейма string mChannels_LowerTF[][8]; // массив с параметрами каналов младшего тафмфрейма // mChannels_LowerTF[i][0] // 0-восходящий канал по 2-м соседним максимальным опорным точкам // 1-нисходящий канал по 2-м соседним максимальным опорным точкам // 2-восходящий канал по 2-м соседним минимальным опорным точкам // 3-нисходящий канал по 2-м соседним минимальным опорным точкам // mChannels_LowerTF[i][1] // время первой опорной точки // mChannels_LowerTF[i][2] // цена первой опорной точки // mChannels_LowerTF[i][3] // время второй опорной точки // mChannels_LowerTF[i][4] // цена второй опорной точки // mChannels_LowerTF[i][5] // время третьей опорной точки // mChannels_LowerTF[i][6] // цена третьей опорной точки // mChannels_LowerTF[i][7] // ширина канала string mChannels_UpperTF[][8]; // массив с параметрами каналов старшего тафмфрейма // mChannels_UpperTF[i][0] // 0-восходящий канал по 2-м соседним максимальным опорным точкам // 1-нисходящий канал по 2-м соседним максимальным опорным точкам // 2-восходящий канал по 2-м соседним минимальным опорным точкам // 3-нисходящий канал по 2-м соседним минимальным опорным точкам // mChannels_UpperTF[i][1] // время первой опорной точки // mChannels_UpperTF[i][2] // цена первой опорной точки // mChannels_UpperTF[i][3] // время второй опорной точки // mChannels_UpperTF[i][4] // цена второй опорной точки // mChannels_UpperTF[i][5] // время третьей опорной точки // mChannels_UpperTF[i][6] // цена третьей опорной точки // mChannels_UpperTF[i][7] // ширина канала //----- 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_2_0"); SetIndexLabel(0,"FractalsUp_LowerTF"); SetIndexLabel(1,"FractalsDown_LowerTF"); SetIndexLabel(2,"FractalsUp_UpperTF"); SetIndexLabel(3,"FractalsDown_UpperTF"); // ----- устанавливаем количество элементов в массивах каналов ArrayResize(mChannels_LowerTF,nChannels_LowerTF); ArrayResize(mChannels_UpperTF,nChannels_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(StringFind(ObjectName(i),"Channel",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(!ShowChannels) { // ----- здесь нужно запустить функцию отрисовки нисходящих "Вил Эндрюса" if(ShowPitchfork_LowerTF) { if(DrawLowerPitchfork(i,0)) { // ----- здесь алерт if(OnAlert_Pitchfork_LowerTF && i==0) { Alert(Symbol(),Period()," Нисходящие Вилы Эндрюса! ",TimeToStr(Time[i],TIME_DATE|TIME_SECONDS)); } } } } // ----- работаем по стратегии "Каналы" if(ShowChannels) { // ----- здесь нужно запустить функцию отрисовки "Каналов" if(ShowChannels_LowerTF) { CheckUpperPoints(i,0); } } // ----- отображаем вракталы младшего таймфрейма if(ShowFractals_LowerTF) { ExtMapBuffer1[i]=Fractals_Upper+Spred*Point; } } // ----- блок нижних фракталов младшего таймфрейма if(Fractals_Lower>0) { // ----- работаем по стратегии "Вилы Эндрюса" if(!ShowChannels) { // ----- здесь нужно запустить функцию отрисовки восходящих "Вил Эндрюса" if(ShowPitchfork_LowerTF) { if(DrawUpperPitchfork(i,0)) { // ----- здесь алерт if(OnAlert_Pitchfork_LowerTF && i==0) { Alert(Symbol(),Period()," Восходящие Вилы Эндрюса! ",TimeToStr(Time[i],TIME_DATE|TIME_SECONDS)); } } } } // ----- работаем по стратегии "Каналы" if(ShowChannels) { // ----- здесь нужно запустить функцию отрисовки "Каналов" if(ShowChannels_LowerTF) { CheckLowerPoints(i,0); } } // ----- отображаем вракталы младшего таймфрейма 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(!ShowChannels) { // ----- здесь нужно запустить функцию отрисовки нисходящих "Вил Эндрюса" 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(ShowChannels) { // ----- здесь нужно запустить функцию отрисовки "Каналов" if(ShowChannels_UpperTF) { CheckUpperPoints(nBars_UpperTF,TF_Upper); } } // ----- отображаем вракталы старшего таймфрейма if(ShowFractals_UpperTF) { ExtMapBuffer3[iBarShift(NULL,0,iTime(NULL,TF_Upper,nBars_UpperTF),false)]=Fractals_Upper+Spred*Point; } } // ----- блок нижних фракталов старшего таймфрейма if(Fractals_Lower>0) { // ----- работаем по стратегии "Вилы Эндрюса" if(!ShowChannels) { // ----- здесь нужно запустить функцию отрисовки восходящих "Вил Эндрюса" 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(ShowChannels) { // ----- здесь нужно запустить функцию отрисовки "Каналов" if(ShowChannels_UpperTF) { CheckLowerPoints(nBars_UpperTF,TF_Upper); } } // ----- отображаем вракталы старшего таймфрейма 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 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); } //+-------------------------------------------------------------------------------------------------------------------------+ //+-------------------------------------------------------------------------------------------------------------------------+ //+------------------------------------------ ФУНКЦИИ ОТРИСОВКИ ВИЛ ЭНДРЮСА ------------------------------------------------+ //+-------------------------------------------------------------------------------------------------------------------------+ //+-------------------------------------------------------------------------------------------------------------------------+ //+---------------------------------------------------------------------------+ bool DrawUpperPitchfork(int nBar,int TF=0) { // Функция определяет и рисует восходящие "Вилы Эндрюса" double Fractals_Upper=0,Fractals_Lower=0; string mFractals[3][3]; int i,j=0; //--------------------------------------------------------- I -- // ----- определяем опорные точки 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; } //-------------------------------------------------------- II -- // ------ проверяем последовтельность опорных точек: 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; //--------------------------------------------------------- I -- // ----- определяем опорные точки 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; } //-------------------------------------------------------- II -- // ------ проверяем последовтельность опорных точек: 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); } //+-------------------------------------------------------------------------------------------------------------------------+ //+-------------------------------------------------------------------------------------------------------------------------+ //+-------------------------------------------- ФУНКЦИИ ОТРИСОВКИ КАНАЛОВ --------------------------------------------------+ //+-------------------------------------------------------------------------------------------------------------------------+ //+-------------------------------------------------------------------------------------------------------------------------+ //+---------------------------------------------------------------------------+ color GetChannelColor(int Index) { // Функция возвращает цвет канала по индексу switch(Index) { case 0: return(Channels_Color0); case 1: return(Channels_Color1); case 2: return(Channels_Color2); case 3: return(Channels_Color3); } return(Channels_Color4); } //+---------------------------------------------------------------------------+ bool CheckUpperPoints(int nBar,int TF=0) { // Функция ищет две соседние максимальные опорные точки double Fractals_Upper=0,Fractals_Lower=0; string mFractals[3][3]; int i,j=0; //--------------------------------------------------------- I -- // ----- определяем опорные точки 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; } //-------------------------------------------------------- II -- // ------ проверяем последовтельность опорных точек: 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(QntChannels_LowerTF=StrToDouble(mFractals[0][1])) mChannels_LowerTF[QntChannels_LowerTF][0]=(string)1; // нисходящий канал по 2-м соседним максимальным опорным точкам mChannels_LowerTF[QntChannels_LowerTF][1]=mFractals[2][0]; // время первой опорной точки mChannels_LowerTF[QntChannels_LowerTF][2]=mFractals[2][1]; // цена первой опорной точки mChannels_LowerTF[QntChannels_LowerTF][3]=mFractals[1][0]; // время второй опорной точки mChannels_LowerTF[QntChannels_LowerTF][4]=mFractals[1][1]; // цена второй опорной точки mChannels_LowerTF[QntChannels_LowerTF][5]=mFractals[0][0]; // время третьей опорной точки mChannels_LowerTF[QntChannels_LowerTF][6]=mFractals[0][1]; // цена третьей опорной точки QntChannels_LowerTF++; // ----- отрисовка канала CheckQntChannels(0,false); } if(QntChannels_LowerTF>=nChannels_LowerTF) {// кол-во каналов превышено, изменяем параметры отрисованных for(i=0; i=StrToDouble(mFractals[0][1])) mChannels_LowerTF[QntChannels_LowerTF-1][0]=(string)1; // нисходящий канал по 2-м соседним максимальным опорным точкам mChannels_LowerTF[QntChannels_LowerTF-1][1]=mFractals[2][0]; // время первой опорной точки mChannels_LowerTF[QntChannels_LowerTF-1][2]=mFractals[2][1]; // цена первой опорной точки mChannels_LowerTF[QntChannels_LowerTF-1][3]=mFractals[1][0]; // время второй опорной точки mChannels_LowerTF[QntChannels_LowerTF-1][4]=mFractals[1][1]; // цена второй опорной точки mChannels_LowerTF[QntChannels_LowerTF-1][5]=mFractals[0][0]; // время третьей опорной точки mChannels_LowerTF[QntChannels_LowerTF-1][6]=mFractals[0][1]; // цена третьей опорной точки // ----- отрисовка канала CheckQntChannels(0,true); } } //--------------------------------------------------------- 2 -- // ----- старший таймфрейм if(TF!=0) { if(QntChannels_UpperTF=StrToDouble(mFractals[0][1])) mChannels_UpperTF[QntChannels_UpperTF][0]=(string)1; // нисходящий канал по 2-м соседним максимальным опорным точкам mChannels_UpperTF[QntChannels_UpperTF][1]=mFractals[2][0]; // время первой опорной точки mChannels_UpperTF[QntChannels_UpperTF][2]=mFractals[2][1]; // цена первой опорной точки mChannels_UpperTF[QntChannels_UpperTF][3]=mFractals[1][0]; // время второй опорной точки mChannels_UpperTF[QntChannels_UpperTF][4]=mFractals[1][1]; // цена второй опорной точки mChannels_UpperTF[QntChannels_UpperTF][5]=mFractals[0][0]; // время третьей опорной точки mChannels_UpperTF[QntChannels_UpperTF][6]=mFractals[0][1]; // цена третьей опорной точки QntChannels_UpperTF++; // ----- отрисовка канала CheckQntChannels(TF_Upper,false); } if(QntChannels_UpperTF>=nChannels_UpperTF) {// кол-во каналов превышено, изменяем параметры отрисованных for(i=0; i=StrToDouble(mFractals[0][1])) mChannels_UpperTF[QntChannels_UpperTF-1][0]=(string)1; // нисходящий канал по 2-м соседним максимальным опорным точкам mChannels_UpperTF[QntChannels_UpperTF-1][1]=mFractals[2][0]; // время первой опорной точки mChannels_UpperTF[QntChannels_UpperTF-1][2]=mFractals[2][1]; // цена первой опорной точки mChannels_UpperTF[QntChannels_UpperTF-1][3]=mFractals[1][0]; // время второй опорной точки mChannels_UpperTF[QntChannels_UpperTF-1][4]=mFractals[1][1]; // цена второй опорной точки mChannels_UpperTF[QntChannels_UpperTF-1][5]=mFractals[0][0]; // время третьей опорной точки mChannels_UpperTF[QntChannels_UpperTF-1][6]=mFractals[0][1]; // цена третьей опорной точки // ----- отрисовка канала CheckQntChannels(TF_Upper,true); } } return(true); } return(false); } //+---------------------------------------------------------------------------+ bool CheckLowerPoints(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(QntChannels_LowerTF=StrToDouble(mFractals[0][1])) mChannels_LowerTF[QntChannels_LowerTF][0]=(string)3; // нисходящий канал по 2-м соседним минимальным опорным точкам mChannels_LowerTF[QntChannels_LowerTF][1]=mFractals[2][0]; // время первой опорной точки mChannels_LowerTF[QntChannels_LowerTF][2]=mFractals[2][1]; // цена первой опорной точки mChannels_LowerTF[QntChannels_LowerTF][3]=mFractals[1][0]; // время второй опорной точки mChannels_LowerTF[QntChannels_LowerTF][4]=mFractals[1][1]; // цена второй опорной точки mChannels_LowerTF[QntChannels_LowerTF][5]=mFractals[0][0]; // время третьей опорной точки mChannels_LowerTF[QntChannels_LowerTF][6]=mFractals[0][1]; // цена третьей опорной точки QntChannels_LowerTF++; // ----- отрисовка канала CheckQntChannels(0,false); } if(QntChannels_LowerTF>=nChannels_LowerTF) {// кол-во каналов превышено, изменяем параметры отрисованных for(i=0; i=StrToDouble(mFractals[0][1])) mChannels_LowerTF[QntChannels_LowerTF-1][0]=(string)3; // нисходящий канал по 2-м соседним минимальным опорным точкам mChannels_LowerTF[QntChannels_LowerTF-1][1]=mFractals[2][0]; // время первой опорной точки mChannels_LowerTF[QntChannels_LowerTF-1][2]=mFractals[2][1]; // цена первой опорной точки mChannels_LowerTF[QntChannels_LowerTF-1][3]=mFractals[1][0]; // время второй опорной точки mChannels_LowerTF[QntChannels_LowerTF-1][4]=mFractals[1][1]; // цена второй опорной точки mChannels_LowerTF[QntChannels_LowerTF-1][5]=mFractals[0][0]; // время третьей опорной точки mChannels_LowerTF[QntChannels_LowerTF-1][6]=mFractals[0][1]; // цена третьей опорной точки // ----- отрисовка канала CheckQntChannels(0,true); } } //--------------------------------------------------------- 2 -- // ----- старший таймфрейм if(TF!=0) { if(QntChannels_UpperTF=StrToDouble(mFractals[0][1])) mChannels_UpperTF[QntChannels_UpperTF][0]=(string)3; // нисходящий канал по 2-м соседним минимальным опорным точкам mChannels_UpperTF[QntChannels_UpperTF][1]=mFractals[2][0]; // время первой опорной точки mChannels_UpperTF[QntChannels_UpperTF][2]=mFractals[2][1]; // цена первой опорной точки mChannels_UpperTF[QntChannels_UpperTF][3]=mFractals[1][0]; // время второй опорной точки mChannels_UpperTF[QntChannels_UpperTF][4]=mFractals[1][1]; // цена второй опорной точки mChannels_UpperTF[QntChannels_UpperTF][5]=mFractals[0][0]; // время третьей опорной точки mChannels_UpperTF[QntChannels_UpperTF][6]=mFractals[0][1]; // цена третьей опорной точки QntChannels_UpperTF++; // ----- отрисовка канала CheckQntChannels(TF_Upper,false); } if(QntChannels_UpperTF>=nChannels_UpperTF) {// кол-во каналов превышено, изменяем параметры отрисованных for(i=0; i=StrToDouble(mFractals[0][1])) mChannels_UpperTF[QntChannels_UpperTF-1][0]=(string)3; // нисходящий канал по 2-м соседним минимальным опорным точкам mChannels_UpperTF[QntChannels_UpperTF-1][1]=mFractals[2][0]; // время первой опорной точки mChannels_UpperTF[QntChannels_UpperTF-1][2]=mFractals[2][1]; // цена первой опорной точки mChannels_UpperTF[QntChannels_UpperTF-1][3]=mFractals[1][0]; // время второй опорной точки mChannels_UpperTF[QntChannels_UpperTF-1][4]=mFractals[1][1]; // цена второй опорной точки mChannels_UpperTF[QntChannels_UpperTF-1][5]=mFractals[0][0]; // время третьей опорной точки mChannels_UpperTF[QntChannels_UpperTF-1][6]=mFractals[0][1]; // цена третьей опорной точки // ----- отрисовка канала CheckQntChannels(TF_Upper,true); } } return(true); } return(false); } //+---------------------------------------------------------------------------+ void CheckQntChannels(int TF=0,bool ReDraw=false) { // Функция отображает новые каналы на графике int Index=0,i=0; string Channels_Name=""; //--------------------------------------------------------- 1 -- // ----- если флаг перерисовки всех каналов FALSE if(!ReDraw) { if(TF==0) { // ----- младший таймфрейм Index=QntChannels_LowerTF-1; } if(TF!=0) { // ----- старший таймфрейм Index=QntChannels_UpperTF-1; } // ----- отрисовка одного канала DrawChannels(TF,Index); } //--------------------------------------------------------- 2 -- // ----- если флаг перерисовки всех каналов TRUE - удаляем все каналы if(ReDraw) { if(TF==0) { // ----- младший таймфрейм Index=QntChannels_LowerTF-1; Channels_Name="Channel_LowerTF"; } if(TF!=0) { // ----- старший таймфрейм Index=QntChannels_UpperTF-1; Channels_Name="Channel_UpperTF"; } int Qnt=ObjectsTotal(); // ----- Удаляем все каналы для указанного таймфрейма for(i=0; i=0) { ObjectDelete(ObjectName(i)); i--; continue; } if(i>=ObjectsTotal()) break; } for(i=0; i<=Index; i++) { // ----- отрисовка каждого канала DrawChannels(TF,i); } } return; } //+---------------------------------------------------------------------------+ void DrawChannels(int TF=0,int Index=0) { // Функция отображает новые каналы на графике //--------------------------------------------------------- 1 -- if(TF==0) { // ----- младший таймфрейм // ----- строим канал по 2-м соседним максимальным опорным точкам if(StrToDouble(mChannels_LowerTF[Index][0])==0 || StrToDouble(mChannels_LowerTF[Index][0])==1) { // ----- опорная линия(верхняя граница) канала ObjectCreate("Channel_LowerTF"+(string)Index+"_UpperLine",OBJ_TREND,0,StrToTime(mChannels_LowerTF[Index][1]),StrToDouble(mChannels_LowerTF[Index][2]), StrToTime(mChannels_LowerTF[Index][5]),StrToDouble(mChannels_LowerTF[Index][6])); ObjectSet("Channel_LowerTF"+(string)Index+"_UpperLine",OBJPROP_RAY,True); ObjectSet("Channel_LowerTF"+(string)Index+"_UpperLine",OBJPROP_WIDTH,3); ObjectSet("Channel_LowerTF"+(string)Index+"_UpperLine",OBJPROP_COLOR,GetChannelColor(Index)); // ----- вычисляем ширину канала mChannels_LowerTF[Index][7]=(string)(ObjectGetValueByShift("Channel_LowerTF"+(string)Index+"_UpperLine",iBarShift(NULL,0,StrToTime(mChannels_LowerTF[Index][3]))) -StrToDouble(mChannels_LowerTF[Index][4])); // ----- нижняя граница канала ObjectCreate("Channel_LowerTF"+(string)Index+"_LowerLine",OBJ_TREND,0,StrToTime(mChannels_LowerTF[Index][3]),StrToDouble(mChannels_LowerTF[Index][4]), StrToTime(mChannels_LowerTF[Index][5]),StrToDouble(mChannels_LowerTF[Index][6])-StrToDouble(mChannels_LowerTF[Index][7])); ObjectSet("Channel_LowerTF"+(string)Index+"_LowerLine",OBJPROP_RAY,True); ObjectSet("Channel_LowerTF"+(string)Index+"_LowerLine",OBJPROP_WIDTH,1); ObjectSet("Channel_LowerTF"+(string)Index+"_LowerLine",OBJPROP_COLOR,GetChannelColor(Index)); // ----- середина канала граница канала ObjectCreate("Channel_LowerTF"+(string)Index+".MiddleLine",OBJ_TREND,0,StrToTime(mChannels_LowerTF[Index][1]),StrToDouble(mChannels_LowerTF[Index][2]) -StrToDouble(mChannels_LowerTF[Index][7])/2, StrToTime(mChannels_LowerTF[Index][5]),StrToDouble(mChannels_LowerTF[Index][6])-StrToDouble(mChannels_LowerTF[Index][7])/2); ObjectSet("Channel_LowerTF"+(string)Index+".MiddleLine",OBJPROP_RAY,True); ObjectSet("Channel_LowerTF"+(string)Index+".MiddleLine",OBJPROP_STYLE,STYLE_DASHDOT); ObjectSet("Channel_LowerTF"+(string)Index+".MiddleLine",OBJPROP_WIDTH,1); ObjectSet("Channel_LowerTF"+(string)Index+".MiddleLine",OBJPROP_COLOR,GetChannelColor(Index)); // ----- верхняя линия ЗУК -10% ObjectCreate("Channel_LowerTF"+(string)Index+"_UpperLineZUK(-10%)",OBJ_TREND,0,StrToTime(mChannels_LowerTF[Index][1]),StrToDouble(mChannels_LowerTF[Index][2]) -StrToDouble(mChannels_LowerTF[Index][7])/10, StrToTime(mChannels_LowerTF[Index][5]),StrToDouble(mChannels_LowerTF[Index][6])-StrToDouble(mChannels_LowerTF[Index][7])/10); ObjectSet("Channel_LowerTF"+(string)Index+"_UpperLineZUK(-10%)",OBJPROP_RAY,True); ObjectSet("Channel_LowerTF"+(string)Index+"_UpperLineZUK(-10%)",OBJPROP_STYLE,STYLE_DASH); ObjectSet("Channel_LowerTF"+(string)Index+"_UpperLineZUK(-10%)",OBJPROP_WIDTH,1); ObjectSet("Channel_LowerTF"+(string)Index+"_UpperLineZUK(-10%)",OBJPROP_COLOR,GetChannelColor(Index)); // ----- нижняя линия ЗУК -10% ObjectCreate("Channel_LowerTF"+(string)Index+"_LowerLineZUK(-10%)",OBJ_TREND,0,StrToTime(mChannels_LowerTF[Index][3]),StrToDouble(mChannels_LowerTF[Index][4]) +StrToDouble(mChannels_LowerTF[Index][7])/10, StrToTime(mChannels_LowerTF[Index][5]),StrToDouble(mChannels_LowerTF[Index][6])-StrToDouble(mChannels_LowerTF[Index][7])+ StrToDouble(mChannels_LowerTF[Index][7])/10); ObjectSet("Channel_LowerTF"+(string)Index+"_LowerLineZUK(-10%)",OBJPROP_RAY,True); ObjectSet("Channel_LowerTF"+(string)Index+"_LowerLineZUK(-10%)",OBJPROP_STYLE,STYLE_DASH); ObjectSet("Channel_LowerTF"+(string)Index+"_LowerLineZUK(-10%)",OBJPROP_WIDTH,1); ObjectSet("Channel_LowerTF"+(string)Index+"_LowerLineZUK(-10%)",OBJPROP_COLOR,GetChannelColor(Index)); // ----- верхняя линия ЗУК +10% ObjectCreate("Channel_LowerTF"+(string)Index+"_UpperLineZUK(+10%)",OBJ_TREND,0,StrToTime(mChannels_LowerTF[Index][1]),StrToDouble(mChannels_LowerTF[Index][2]) +StrToDouble(mChannels_LowerTF[Index][7])/10, StrToTime(mChannels_LowerTF[Index][5]),StrToDouble(mChannels_LowerTF[Index][6])+StrToDouble(mChannels_LowerTF[Index][7])/10); ObjectSet("Channel_LowerTF"+(string)Index+"_UpperLineZUK(+10%)",OBJPROP_RAY,True); ObjectSet("Channel_LowerTF"+(string)Index+"_UpperLineZUK(+10%)",OBJPROP_STYLE,STYLE_DASH); ObjectSet("Channel_LowerTF"+(string)Index+"_UpperLineZUK(+10%)",OBJPROP_WIDTH,1); ObjectSet("Channel_LowerTF"+(string)Index+"_UpperLineZUK(+10%)",OBJPROP_COLOR,GetChannelColor(Index)); // ----- нижняя линия ЗУК +10% ObjectCreate("Channel_LowerTF"+(string)Index+"_LowerLineZUK(+10%)",OBJ_TREND,0,StrToTime(mChannels_LowerTF[Index][3]),StrToDouble(mChannels_LowerTF[Index][4]) -StrToDouble(mChannels_LowerTF[Index][7])/10, StrToTime(mChannels_LowerTF[Index][5]),StrToDouble(mChannels_LowerTF[Index][6])-StrToDouble(mChannels_LowerTF[Index][7])- StrToDouble(mChannels_LowerTF[Index][7])/10); ObjectSet("Channel_LowerTF"+(string)Index+"_LowerLineZUK(+10%)",OBJPROP_RAY,True); ObjectSet("Channel_LowerTF"+(string)Index+"_LowerLineZUK(+10%)",OBJPROP_STYLE,STYLE_DASH); ObjectSet("Channel_LowerTF"+(string)Index+"_LowerLineZUK(+10%)",OBJPROP_WIDTH,1); ObjectSet("Channel_LowerTF"+(string)Index+"_LowerLineZUK(+10%)",OBJPROP_COLOR,GetChannelColor(Index)); } // ----- строим канал по 2-м соседним минимальным опорным точкам if(StrToDouble(mChannels_LowerTF[Index][0])==2 || StrToDouble(mChannels_LowerTF[Index][0])==3) { // ----- опорная линия(нижняя граница) канала ObjectCreate("Channel_LowerTF"+(string)Index+"_LowerLine",OBJ_TREND,0,StrToTime(mChannels_LowerTF[Index][1]),StrToDouble(mChannels_LowerTF[Index][2]), StrToTime(mChannels_LowerTF[Index][5]),StrToDouble(mChannels_LowerTF[Index][6])); ObjectSet("Channel_LowerTF"+(string)Index+"_LowerLine",OBJPROP_RAY,True); ObjectSet("Channel_LowerTF"+(string)Index+"_LowerLine",OBJPROP_WIDTH,3); ObjectSet("Channel_LowerTF"+(string)Index+"_LowerLine",OBJPROP_COLOR,GetChannelColor(Index)); // ----- вычисляем ширину канала mChannels_LowerTF[Index][7]=(string)(ObjectGetValueByShift("Channel_LowerTF"+(string)Index+"_LowerLine",iBarShift(NULL,0,StrToTime(mChannels_LowerTF[Index][3]))) -StrToDouble(mChannels_LowerTF[Index][4])); // ----- верхняя граница канала ObjectCreate("Channel_LowerTF"+(string)Index+"_UpperLine",OBJ_TREND,0,StrToTime(mChannels_LowerTF[Index][3]),StrToDouble(mChannels_LowerTF[Index][4]), StrToTime(mChannels_LowerTF[Index][5]),StrToDouble(mChannels_LowerTF[Index][6])-StrToDouble(mChannels_LowerTF[Index][7])); ObjectSet("Channel_LowerTF"+(string)Index+"_UpperLine",OBJPROP_RAY,True); ObjectSet("Channel_LowerTF"+(string)Index+"_UpperLine",OBJPROP_WIDTH,1); ObjectSet("Channel_LowerTF"+(string)Index+"_UpperLine",OBJPROP_COLOR,GetChannelColor(Index)); // ----- середина канала граница канала ObjectCreate("Channel_LowerTF"+(string)Index+".MiddleLine",OBJ_TREND,0,StrToTime(mChannels_LowerTF[Index][1]),StrToDouble(mChannels_LowerTF[Index][2]) -StrToDouble(mChannels_LowerTF[Index][7])/2, StrToTime(mChannels_LowerTF[Index][5]),StrToDouble(mChannels_LowerTF[Index][6])-StrToDouble(mChannels_LowerTF[Index][7])/2); ObjectSet("Channel_LowerTF"+(string)Index+".MiddleLine",OBJPROP_RAY,True); ObjectSet("Channel_LowerTF"+(string)Index+".MiddleLine",OBJPROP_STYLE,STYLE_DASHDOT); ObjectSet("Channel_LowerTF"+(string)Index+".MiddleLine",OBJPROP_WIDTH,1); ObjectSet("Channel_LowerTF"+(string)Index+".MiddleLine",OBJPROP_COLOR,GetChannelColor(Index)); // ----- нижняя линия ЗУК -10% ObjectCreate("Channel_LowerTF"+(string)Index+"_LowerLineZUK(-10%)",OBJ_TREND,0,StrToTime(mChannels_LowerTF[Index][1]),StrToDouble(mChannels_LowerTF[Index][2]) -StrToDouble(mChannels_LowerTF[Index][7])/10, StrToTime(mChannels_LowerTF[Index][5]),StrToDouble(mChannels_LowerTF[Index][6])-StrToDouble(mChannels_LowerTF[Index][7])/10); ObjectSet("Channel_LowerTF"+(string)Index+"_LowerLineZUK(-10%)",OBJPROP_RAY,True); ObjectSet("Channel_LowerTF"+(string)Index+"_LowerLineZUK(-10%)",OBJPROP_STYLE,STYLE_DASH); ObjectSet("Channel_LowerTF"+(string)Index+"_LowerLineZUK(-10%)",OBJPROP_WIDTH,1); ObjectSet("Channel_LowerTF"+(string)Index+"_LowerLineZUK(-10%)",OBJPROP_COLOR,GetChannelColor(Index)); // ----- верхняя линия ЗУК -10% ObjectCreate("Channel_LowerTF"+(string)Index+"_UpperLineZUK(-10%)",OBJ_TREND,0,StrToTime(mChannels_LowerTF[Index][3]),StrToDouble(mChannels_LowerTF[Index][4]) +StrToDouble(mChannels_LowerTF[Index][7])/10, StrToTime(mChannels_LowerTF[Index][5]),StrToDouble(mChannels_LowerTF[Index][6])-StrToDouble(mChannels_LowerTF[Index][7])+ StrToDouble(mChannels_LowerTF[Index][7])/10); ObjectSet("Channel_LowerTF"+(string)Index+"_UpperLineZUK(-10%)",OBJPROP_RAY,True); ObjectSet("Channel_LowerTF"+(string)Index+"_UpperLineZUK(-10%)",OBJPROP_STYLE,STYLE_DASH); ObjectSet("Channel_LowerTF"+(string)Index+"_UpperLineZUK(-10%)",OBJPROP_WIDTH,1); ObjectSet("Channel_LowerTF"+(string)Index+"_UpperLineZUK(-10%)",OBJPROP_COLOR,GetChannelColor(Index)); // ----- нижняя линия ЗУК +10% ObjectCreate("Channel_LowerTF"+(string)Index+"_LowerLineZUK(+10%)",OBJ_TREND,0,StrToTime(mChannels_LowerTF[Index][1]),StrToDouble(mChannels_LowerTF[Index][2]) +StrToDouble(mChannels_LowerTF[Index][7])/10, StrToTime(mChannels_LowerTF[Index][5]),StrToDouble(mChannels_LowerTF[Index][6])+StrToDouble(mChannels_LowerTF[Index][7])/10); ObjectSet("Channel_LowerTF"+(string)Index+"_LowerLineZUK(+10%)",OBJPROP_RAY,True); ObjectSet("Channel_LowerTF"+(string)Index+"_LowerLineZUK(+10%)",OBJPROP_STYLE,STYLE_DASH); ObjectSet("Channel_LowerTF"+(string)Index+"_LowerLineZUK(+10%)",OBJPROP_WIDTH,1); ObjectSet("Channel_LowerTF"+(string)Index+"_LowerLineZUK(+10%)",OBJPROP_COLOR,GetChannelColor(Index)); // ----- верхняя линия ЗУК +10% ObjectCreate("Channel_LowerTF"+(string)Index+"_UpperLineZUK(+10%)",OBJ_TREND,0,StrToTime(mChannels_LowerTF[Index][3]),StrToDouble(mChannels_LowerTF[Index][4]) -StrToDouble(mChannels_LowerTF[Index][7])/10, StrToTime(mChannels_LowerTF[Index][5]),StrToDouble(mChannels_LowerTF[Index][6])-StrToDouble(mChannels_LowerTF[Index][7])- StrToDouble(mChannels_LowerTF[Index][7])/10); ObjectSet("Channel_LowerTF"+(string)Index+"_UpperLineZUK(+10%)",OBJPROP_RAY,True); ObjectSet("Channel_LowerTF"+(string)Index+"_UpperLineZUK(+10%)",OBJPROP_STYLE,STYLE_DASH); ObjectSet("Channel_LowerTF"+(string)Index+"_UpperLineZUK(+10%)",OBJPROP_WIDTH,1); ObjectSet("Channel_LowerTF"+(string)Index+"_UpperLineZUK(+10%)",OBJPROP_COLOR,GetChannelColor(Index)); } } //--------------------------------------------------------- 2 -- if(TF!=0) { // ----- старший таймфрейм // ----- строим канал по 2-м соседним максимальным опорным точкам if(StrToDouble(mChannels_UpperTF[Index][0])==0 || StrToDouble(mChannels_UpperTF[Index][0])==1) { // ----- опорная линия(верхняя граница) канала ObjectCreate("Channel_UpperTF"+(string)Index+"_UpperLine",OBJ_TREND,0,StrToTime(mChannels_UpperTF[Index][1]),StrToDouble(mChannels_UpperTF[Index][2]), StrToTime(mChannels_UpperTF[Index][5]),StrToDouble(mChannels_UpperTF[Index][6])); ObjectSet("Channel_UpperTF"+(string)Index+"_UpperLine",OBJPROP_RAY,True); ObjectSet("Channel_UpperTF"+(string)Index+"_UpperLine",OBJPROP_WIDTH,3); ObjectSet("Channel_UpperTF"+(string)Index+"_UpperLine",OBJPROP_COLOR,GetChannelColor(Index)); // ----- вычисляем ширину канала mChannels_UpperTF[Index][7]=(string)(ObjectGetValueByShift("Channel_UpperTF"+(string)Index+"_UpperLine",iBarShift(NULL,0,StrToTime(mChannels_UpperTF[Index][3]))) -StrToDouble(mChannels_UpperTF[Index][4])); // ----- нижняя граница канала ObjectCreate("Channel_UpperTF"+(string)Index+"_LowerLine",OBJ_TREND,0,StrToTime(mChannels_UpperTF[Index][3]),StrToDouble(mChannels_UpperTF[Index][4]), StrToTime(mChannels_UpperTF[Index][5]),StrToDouble(mChannels_UpperTF[Index][6])-StrToDouble(mChannels_UpperTF[Index][7])); ObjectSet("Channel_UpperTF"+(string)Index+"_LowerLine",OBJPROP_RAY,True); ObjectSet("Channel_UpperTF"+(string)Index+"_LowerLine",OBJPROP_WIDTH,1); ObjectSet("Channel_UpperTF"+(string)Index+"_LowerLine",OBJPROP_COLOR,GetChannelColor(Index)); // ----- середина канала граница канала ObjectCreate("Channel_UpperTF"+(string)Index+".MiddleLine",OBJ_TREND,0,StrToTime(mChannels_UpperTF[Index][1]),StrToDouble(mChannels_UpperTF[Index][2]) -StrToDouble(mChannels_UpperTF[Index][7])/2, StrToTime(mChannels_UpperTF[Index][5]),StrToDouble(mChannels_UpperTF[Index][6])-StrToDouble(mChannels_UpperTF[Index][7])/2); ObjectSet("Channel_UpperTF"+(string)Index+".MiddleLine",OBJPROP_RAY,True); ObjectSet("Channel_UpperTF"+(string)Index+".MiddleLine",OBJPROP_STYLE,STYLE_DASHDOT); ObjectSet("Channel_UpperTF"+(string)Index+".MiddleLine",OBJPROP_WIDTH,1); ObjectSet("Channel_UpperTF"+(string)Index+".MiddleLine",OBJPROP_COLOR,GetChannelColor(Index)); // ----- верхняя линия ЗУК -10% ObjectCreate("Channel_UpperTF"+(string)Index+"_UpperLineZUK(-10%)",OBJ_TREND,0,StrToTime(mChannels_UpperTF[Index][1]),StrToDouble(mChannels_UpperTF[Index][2]) -StrToDouble(mChannels_UpperTF[Index][7])/10, StrToTime(mChannels_UpperTF[Index][5]),StrToDouble(mChannels_UpperTF[Index][6])-StrToDouble(mChannels_UpperTF[Index][7])/10); ObjectSet("Channel_UpperTF"+(string)Index+"_UpperLineZUK(-10%)",OBJPROP_RAY,True); ObjectSet("Channel_UpperTF"+(string)Index+"_UpperLineZUK(-10%)",OBJPROP_STYLE,STYLE_DASH); ObjectSet("Channel_UpperTF"+(string)Index+"_UpperLineZUK(-10%)",OBJPROP_WIDTH,1); ObjectSet("Channel_UpperTF"+(string)Index+"_UpperLineZUK(-10%)",OBJPROP_COLOR,GetChannelColor(Index)); // ----- нижняя линия ЗУК -10% ObjectCreate("Channel_UpperTF"+(string)Index+"_LowerLineZUK(-10%)",OBJ_TREND,0,StrToTime(mChannels_UpperTF[Index][3]),StrToDouble(mChannels_UpperTF[Index][4]) +StrToDouble(mChannels_UpperTF[Index][7])/10, StrToTime(mChannels_UpperTF[Index][5]),StrToDouble(mChannels_UpperTF[Index][6])-StrToDouble(mChannels_UpperTF[Index][7])+ StrToDouble(mChannels_UpperTF[Index][7])/10); ObjectSet("Channel_UpperTF"+(string)Index+"_LowerLineZUK(-10%)",OBJPROP_RAY,True); ObjectSet("Channel_UpperTF"+(string)Index+"_LowerLineZUK(-10%)",OBJPROP_STYLE,STYLE_DASH); ObjectSet("Channel_UpperTF"+(string)Index+"_LowerLineZUK(-10%)",OBJPROP_WIDTH,1); ObjectSet("Channel_UpperTF"+(string)Index+"_LowerLineZUK(-10%)",OBJPROP_COLOR,GetChannelColor(Index)); // ----- верхняя линия ЗУК +10% ObjectCreate("Channel_UpperTF"+(string)Index+"_UpperLineZUK(+10%)",OBJ_TREND,0,StrToTime(mChannels_UpperTF[Index][1]),StrToDouble(mChannels_UpperTF[Index][2]) +StrToDouble(mChannels_UpperTF[Index][7])/10, StrToTime(mChannels_UpperTF[Index][5]),StrToDouble(mChannels_UpperTF[Index][6])+StrToDouble(mChannels_UpperTF[Index][7])/10); ObjectSet("Channel_UpperTF"+(string)Index+"_UpperLineZUK(+10%)",OBJPROP_RAY,True); ObjectSet("Channel_UpperTF"+(string)Index+"_UpperLineZUK(+10%)",OBJPROP_STYLE,STYLE_DASH); ObjectSet("Channel_UpperTF"+(string)Index+"_UpperLineZUK(+10%)",OBJPROP_WIDTH,1); ObjectSet("Channel_UpperTF"+(string)Index+"_UpperLineZUK(+10%)",OBJPROP_COLOR,GetChannelColor(Index)); // ----- нижняя линия ЗУК +10% ObjectCreate("Channel_UpperTF"+(string)Index+"_LowerLineZUK(+10%)",OBJ_TREND,0,StrToTime(mChannels_UpperTF[Index][3]),StrToDouble(mChannels_UpperTF[Index][4]) -StrToDouble(mChannels_UpperTF[Index][7])/10, StrToTime(mChannels_UpperTF[Index][5]),StrToDouble(mChannels_UpperTF[Index][6])-StrToDouble(mChannels_UpperTF[Index][7])- StrToDouble(mChannels_UpperTF[Index][7])/10); ObjectSet("Channel_UpperTF"+(string)Index+"_LowerLineZUK(+10%)",OBJPROP_RAY,True); ObjectSet("Channel_UpperTF"+(string)Index+"_LowerLineZUK(+10%)",OBJPROP_STYLE,STYLE_DASH); ObjectSet("Channel_UpperTF"+(string)Index+"_LowerLineZUK(+10%)",OBJPROP_WIDTH,1); ObjectSet("Channel_UpperTF"+(string)Index+"_LowerLineZUK(+10%)",OBJPROP_COLOR,GetChannelColor(Index)); } // ----- строим канал по 2-м соседним минимальным опорным точкам if(StrToDouble(mChannels_UpperTF[Index][0])==2 || StrToDouble(mChannels_UpperTF[Index][0])==3) { // ----- опорная линия(нижняя граница) канала ObjectCreate("Channel_UpperTF"+(string)Index+"_LowerLine",OBJ_TREND,0,StrToTime(mChannels_UpperTF[Index][1]),StrToDouble(mChannels_UpperTF[Index][2]), StrToTime(mChannels_UpperTF[Index][5]),StrToDouble(mChannels_UpperTF[Index][6])); ObjectSet("Channel_UpperTF"+(string)Index+"_LowerLine",OBJPROP_RAY,True); ObjectSet("Channel_UpperTF"+(string)Index+"_LowerLine",OBJPROP_WIDTH,3); ObjectSet("Channel_UpperTF"+(string)Index+"_LowerLine",OBJPROP_COLOR,GetChannelColor(Index)); // ----- вычисляем ширину канала mChannels_UpperTF[Index][7]=(string)(ObjectGetValueByShift("Channel_UpperTF"+(string)Index+"_LowerLine",iBarShift(NULL,0,StrToTime(mChannels_UpperTF[Index][3]))) -StrToDouble(mChannels_UpperTF[Index][4])); // ----- верхняя граница канала ObjectCreate("Channel_UpperTF"+(string)Index+"_UpperLine",OBJ_TREND,0,StrToTime(mChannels_UpperTF[Index][3]),StrToDouble(mChannels_UpperTF[Index][4]), StrToTime(mChannels_UpperTF[Index][5]),StrToDouble(mChannels_UpperTF[Index][6])-StrToDouble(mChannels_UpperTF[Index][7])); ObjectSet("Channel_UpperTF"+(string)Index+"_UpperLine",OBJPROP_RAY,True); ObjectSet("Channel_UpperTF"+(string)Index+"_UpperLine",OBJPROP_WIDTH,1); ObjectSet("Channel_UpperTF"+(string)Index+"_UpperLine",OBJPROP_COLOR,GetChannelColor(Index)); // ----- середина канала граница канала ObjectCreate("Channel_UpperTF"+(string)Index+".MiddleLine",OBJ_TREND,0,StrToTime(mChannels_UpperTF[Index][1]),StrToDouble(mChannels_UpperTF[Index][2]) -StrToDouble(mChannels_UpperTF[Index][7])/2, StrToTime(mChannels_UpperTF[Index][5]),StrToDouble(mChannels_UpperTF[Index][6])-StrToDouble(mChannels_UpperTF[Index][7])/2); ObjectSet("Channel_UpperTF"+(string)Index+".MiddleLine",OBJPROP_RAY,True); ObjectSet("Channel_UpperTF"+(string)Index+".MiddleLine",OBJPROP_STYLE,STYLE_DASHDOT); ObjectSet("Channel_UpperTF"+(string)Index+".MiddleLine",OBJPROP_WIDTH,1); ObjectSet("Channel_UpperTF"+(string)Index+".MiddleLine",OBJPROP_COLOR,GetChannelColor(Index)); // ----- нижняя линия ЗУК -10% ObjectCreate("Channel_UpperTF"+(string)Index+"_LowerLineZUK(-10%)",OBJ_TREND,0,StrToTime(mChannels_UpperTF[Index][1]),StrToDouble(mChannels_UpperTF[Index][2]) -StrToDouble(mChannels_UpperTF[Index][7])/10, StrToTime(mChannels_UpperTF[Index][5]),StrToDouble(mChannels_UpperTF[Index][6])-StrToDouble(mChannels_UpperTF[Index][7])/10); ObjectSet("Channel_UpperTF"+(string)Index+"_LowerLineZUK(-10%)",OBJPROP_RAY,True); ObjectSet("Channel_UpperTF"+(string)Index+"_LowerLineZUK(-10%)",OBJPROP_STYLE,STYLE_DASH); ObjectSet("Channel_UpperTF"+(string)Index+"_LowerLineZUK(-10%)",OBJPROP_WIDTH,1); ObjectSet("Channel_UpperTF"+(string)Index+"_LowerLineZUK(-10%)",OBJPROP_COLOR,GetChannelColor(Index)); // ----- верхняя линия ЗУК -10% ObjectCreate("Channel_UpperTF"+(string)Index+"_UpperLineZUK(-10%)",OBJ_TREND,0,StrToTime(mChannels_UpperTF[Index][3]),StrToDouble(mChannels_UpperTF[Index][4]) +StrToDouble(mChannels_UpperTF[Index][7])/10, StrToTime(mChannels_UpperTF[Index][5]),StrToDouble(mChannels_UpperTF[Index][6])-StrToDouble(mChannels_UpperTF[Index][7])+ StrToDouble(mChannels_UpperTF[Index][7])/10); ObjectSet("Channel_UpperTF"+(string)Index+"_UpperLineZUK(-10%)",OBJPROP_RAY,True); ObjectSet("Channel_UpperTF"+(string)Index+"_UpperLineZUK(-10%)",OBJPROP_STYLE,STYLE_DASH); ObjectSet("Channel_UpperTF"+(string)Index+"_UpperLineZUK(-10%)",OBJPROP_WIDTH,1); ObjectSet("Channel_UpperTF"+(string)Index+"_UpperLineZUK(-10%)",OBJPROP_COLOR,GetChannelColor(Index)); // ----- нижняя линия ЗУК +10% ObjectCreate("Channel_UpperTF"+(string)Index+"_LowerLineZUK(+10%)",OBJ_TREND,0,StrToTime(mChannels_UpperTF[Index][1]),StrToDouble(mChannels_UpperTF[Index][2]) +StrToDouble(mChannels_UpperTF[Index][7])/10, StrToTime(mChannels_UpperTF[Index][5]),StrToDouble(mChannels_UpperTF[Index][6])+StrToDouble(mChannels_UpperTF[Index][7])/10); ObjectSet("Channel_UpperTF"+(string)Index+"_LowerLineZUK(+10%)",OBJPROP_RAY,True); ObjectSet("Channel_UpperTF"+(string)Index+"_LowerLineZUK(+10%)",OBJPROP_STYLE,STYLE_DASH); ObjectSet("Channel_UpperTF"+(string)Index+"_LowerLineZUK(+10%)",OBJPROP_WIDTH,1); ObjectSet("Channel_UpperTF"+(string)Index+"_LowerLineZUK(+10%)",OBJPROP_COLOR,GetChannelColor(Index)); // ----- верхняя линия ЗУК +10% ObjectCreate("Channel_UpperTF"+(string)Index+"_UpperLineZUK(+10%)",OBJ_TREND,0,StrToTime(mChannels_UpperTF[Index][3]),StrToDouble(mChannels_UpperTF[Index][4]) -StrToDouble(mChannels_UpperTF[Index][7])/10, StrToTime(mChannels_UpperTF[Index][5]),StrToDouble(mChannels_UpperTF[Index][6])-StrToDouble(mChannels_UpperTF[Index][7])- StrToDouble(mChannels_UpperTF[Index][7])/10); ObjectSet("Channel_UpperTF"+(string)Index+"_UpperLineZUK(+10%)",OBJPROP_RAY,True); ObjectSet("Channel_UpperTF"+(string)Index+"_UpperLineZUK(+10%)",OBJPROP_STYLE,STYLE_DASH); ObjectSet("Channel_UpperTF"+(string)Index+"_UpperLineZUK(+10%)",OBJPROP_WIDTH,1); ObjectSet("Channel_UpperTF"+(string)Index+"_UpperLineZUK(+10%)",OBJPROP_COLOR,GetChannelColor(Index)); } } return; } //+------------------------------------------------------------------+