//+---------------------------------------------------------------------------+ //| mv-i-Fibo_1_0.mq4 | //| Максим Василенко В. MaxV42 | //| http:// | //| Индикатор строит Фибо-уровни по экстримальным точкам старшего таймфрема. | //+---------------------------------------------------------------------------+ //| Версия 1.0 от 22.03.2010 | //+---------------------------------------------------------------------------+ #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 int TF.Upper = 1440; // Старший таймфрейм extern bool ShowFractals.UpperTF = false; // Вкл/выкл значков фракталов extern bool Show.FiboLevels = true; // Вкл/выкл Фибо-уровней extern bool Show.FiboArcs = true; // Вкл/выкл Фибо-дуги extern int nFibo = 1; // кол-во Фибо-уровней //+---------------------------------------------------------------------------+ extern string Ind_Coment2= "--- Параметры отображения каналов ---"; extern color Fibo.Color0 = DodgerBlue; // Цвет 0 Фибо-уровней extern color Fibo.Color1 = Magenta; // Цвет 1 Фибо-уровней extern color Fibo.Color2 = Green; // Цвет 2 Фибо-уровней extern color Fibo.Color3 = Peru; // Цвет 3 Фибо-уровней extern color Fibo.Color4 = Black; // Цвет остальных Фибо-уровней extern int nBars.History = 1000; // кол-во баров отрисовки индикатора //+---------------------------------------------------------------------------+ // глобальные переменные int nBars.LowerTF = 0, // кол-во баров младшего тафмфрейма nBars.UpperTF = 0; // кол-во баров старшего тафмфрейма int QntFiboLevels = 0; // кол-во уже отрисованных Фибо-уровней //----- buffers double ExtMapBuffer1[]; double ExtMapBuffer2[]; //+---------------------------------------------------------------------------+ void init() { // Custom indicator initialization function // ----- 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); // ----- Name for DataWindow and indicator subwindow label IndicatorShortName("mv-i-Fibo_1_0"); SetIndexLabel(0,"FractalsUp.UpperTF"); SetIndexLabel(1,"FractalsDown.UpperTF"); return; } //+---------------------------------------------------------------------------+ void deinit() { // Custom indicator deinitialization function // ----- Удаляем Фибо-уровни с графика DeleteFibo(); return; } //+---------------------------------------------------------------------------+ void start() { // Custom indicator iteration function int counted_bars=IndicatorCounted(); int limit; int Spred=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>nBars.History) limit=nBars.History; // ----- Основной цикл for (int i=limit; i>=0; i--) { //--------------------------------------------------------- 1 -- // ----- появился новый бар старшего таймфрейма if(isNewBar.UpperTF(Time[i])) { Fractals.Upper=0;Fractals.Lower=0; 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(ShowFractals.UpperTF) { ExtMapBuffer1[iBarShift(NULL,0,iTime(NULL,TF.Upper,nBars.UpperTF),false)]=Fractals.Upper+Spred*Point; } // ----- отображаем Фибо-уровни DrawFibo(nBars.UpperTF); } // ----- блок нижних фракталов старшего таймфрейма if(Fractals.Lower>0) { // ----- отображаем вракталы старшего таймфрейма if(ShowFractals.UpperTF) { ExtMapBuffer2[iBarShift(NULL,0,iTime(NULL,TF.Upper,nBars.UpperTF),false)]=Fractals.Lower-Spred*Point; } // ----- отображаем Фибо-уровни DrawFibo(nBars.UpperTF); } } } 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(TF.Upper<=Period()) { TextMessage="Неверные значения внешних параметров индикатора!"+ "Значение старшего таймфрейма должно быть >(больше) текущего!"; Alert(TextMessage); return(false); } return(true); } //+-------------------------------------------------------------------------------------------------------------------------+ //+-------------------------------------------------------------------------------------------------------------------------+ //+-------------------------------------------- ФУНКЦИИ ОТРИСОВКИ Фибо-уровней ---------------------------------------------+ //+-------------------------------------------------------------------------------------------------------------------------+ //+-------------------------------------------------------------------------------------------------------------------------+ //+---------------------------------------------------------------------------+ color GetFiboColor(int Index) { // Функция возвращает цвет Фибо-уровня по индексу switch(Index) { case 0: return(Fibo.Color0); case 1: return(Fibo.Color1); case 2: return(Fibo.Color2); case 3: return(Fibo.Color3); } return(Fibo.Color4); } //+---------------------------------------------------------------------------+ void DeleteFibo() { // Функция удаляет все Фибо-уровни с графика int Qnt=ObjectsTotal(); for (int i=0; i=0) { ObjectDelete(ObjectName(i)); // Фибо-уровни i--; continue; } if(StringFind(ObjectName(i),"FiboArcs",0)>=0) { ObjectDelete(ObjectName(i)); // удалям Фибо-дуги i--; continue; } if(i>=ObjectsTotal()) break; } return; } //+---------------------------------------------------------------------------+ void DrawFibo(int nBar) { // Функция отображает Фибо-уровней на графике double Fractals.Upper=0,Fractals.Lower=0; string mFractals[][3]; int i,j=0; ArrayResize(mFractals,nFibo*4); // ----- Удаляем Фибо-уровни с графика DeleteFibo(); //--------------------------------------------------------- 1 -- // ----- определяем опорные точки for (i=nBar; i0) { mFractals[j][0]=TimeToStr(iTime(NULL,TF.Upper,i),TIME_DATE|TIME_MINUTES); mFractals[j][1]=DoubleToStr(Fractals.Lower,Digits); mFractals[j][2]=-1; j++; } if(Fractals.Upper>0) { mFractals[j][0]=TimeToStr(iTime(NULL,TF.Upper,i),TIME_DATE|TIME_MINUTES); mFractals[j][1]=DoubleToStr(Fractals.Upper,Digits); mFractals[j][2]=1; j++; } if(j>(nFibo*4-1)) break; } //--------------------------------------------------------- 2 -- j=0; for (i=0; i(nFibo-1)) break; } }