//+------------------------------------------------------------------+ //| mv-i-Chuvashov.mq4 | //| Максим Василенко В. MaxV42 | //| http:// | //| Индикатор работает по стратегии "Вилка Чувашова". | //| Версия 1.0: | //+------------------------------------------------------------------+ #property copyright "Максим Василенко В. MaxV42" #property link "http://" //+------------------------------------------------------------------+ #property indicator_chart_window #property indicator_buffers 2 #property indicator_color1 Blue #property indicator_color2 Red #property indicator_width1 1 #property indicator_width2 1 //+------------------------------------------------------------------+ extern string Ind_Coment1= "--- Внешние параметры индикатора ---"; extern bool ShowFractals = true; // Вкл/выкл значков фракталов extern bool OnAlert = true; // Вкл/выкл сигнала extern bool OnPrint = false; // Вкл/выкл вывод сигнала в журнале эксперта extern int nVilka.Upper = 1; // Количество выводимых восходящих "вилок" extern int nVilka.Lower = 1; // Количество выводимых нисходящих "вилок" extern color Color.LineUpper = Red; // Цвет восходящих "вилок" extern color Color.LineLower = Blue; // Цвет нисходящих "вилок" extern int Width.LineUpper = 2; // Ширина восходящих "вилок" extern int Width.LineLower = 2; // Ширина нисходящих "вилок" //+------------------------------------------------------------------+ // глобальные переменные int nLine.Upper = 0, // Количество трендовых линий, направленных вверх nLine.Lower = 0, // Количество трендовых линий, направленных вниз nBars = 0; // datetime mLineUpper.DateTime[][2]; // массив с параметрами восходящих "вилок" // mLineUpper.DateTime[i][0] // Время первой координаты // mLineUpper.DateTime[i][1] // Время второй координаты double mLineUpper.Price[][2]; // массив с параметрами восходящих "вилок" // mLineUpper.Price[i][0] // Цена первой координаты // mLineUpper.Price[i][1] // Цена второй координаты datetime mLineLower.DateTime[][2]; // массив с параметрами нисходящих "вилок" // mLineLower.DateTime[i][0] // Время первой координаты // mLineLower.DateTime[i][1] // Время второй координаты double mLineLower.Price[][2]; // массив с параметрами нисходящих "вилок" // mLineLower.Price[i][0] // Цена первой координаты // mLineLower.Price[i][1] // Цена второй координаты //----- buffers double ExtMapBuffer1[]; double ExtMapBuffer2[]; //+------------------------------------------------------------------+ void init() { // Custom indicator initialization function int Qnt=ObjectsTotal(); // ----- Indicators Properties SetIndexStyle(0,DRAW_ARROW); SetIndexArrow(0,217); SetIndexBuffer(0,ExtMapBuffer1); SetIndexEmptyValue(0,0.0); SetIndexStyle(1,DRAW_ARROW); SetIndexArrow(1,218); SetIndexBuffer(1,ExtMapBuffer2); SetIndexEmptyValue(1,0.0); // ----- Name for DataWindow and indicator subwindow label IndicatorShortName("Fractals"); SetIndexLabel(0,"FractalsUp"); SetIndexLabel(1,"FractalsDown"); // ----- устанавливаем количество элементов в массивах трендовых линий ArrayResize(mLineUpper.DateTime,nVilka.Upper*2); ArrayResize(mLineUpper.Price,nVilka.Upper*2); ArrayResize(mLineLower.DateTime,nVilka.Lower*2); ArrayResize(mLineLower.Price,nVilka.Lower*2); 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),"Line.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=MarketInfo(Symbol(),MODE_SPREAD); // новый бар не появился if(!isNewBar()) return; // ----- Последний посчитанный бар будет пересчитан if (counted_bars>0) counted_bars--; limit=Bars-counted_bars; // ----- Основной цикл for (int i=limit; i>2; i--) { if(ShowFractals) { // отображаем врыкталы на графике ExtMapBuffer1[i]=iFractals(NULL,0,MODE_UPPER,i)+Spred*Point; ExtMapBuffer2[i]=iFractals(NULL,0,MODE_LOWER,i)-Spred*Point; } //---- Блок Upper-фракталов (нисходящие "вилки") if (iFractals(NULL,0,MODE_UPPER,i)!=0) { if(LowerVilka(i)) { if(OnAlert) Alert(Symbol(),Period()," Нисходящая вилка! ",TimeToStr(Time[i],TIME_DATE|TIME_SECONDS)); if(OnPrint) Print(Symbol(),Period()," Нисходящая вилка! ",TimeToStr(Time[i],TIME_DATE|TIME_SECONDS)); } } //---- Блок Lower-фракталов (восходящие "вилки") if (iFractals(NULL,0,MODE_LOWER,i)!=0) { if(UpperVilka(i)) { if(OnAlert) Alert(Symbol(),Period()," Восходящая вилка! ",TimeToStr(Time[i],TIME_DATE|TIME_SECONDS)); if(OnPrint) Print(Symbol(),Period()," Восходящая вилка! ",TimeToStr(Time[i],TIME_DATE|TIME_SECONDS)); } } } return; } //+------------------------------------------------------------------+ bool UpperVilka(int nBar) { // Функция определяет и рисует восходящие "вилки" int j=0; double Fractal.Lower=0; double mFractals.Price[3]; datetime mFractals.DateTime[3]; // ----- заполняем массивы информацией о последних трех фракталах ArrayInitialize(mFractals.Price,0); ArrayInitialize(mFractals.DateTime,0); for (int i=nBar; i2) break; } // ----- рисуем восходящую "вилку" if(mFractals.Price[2]2) break; } // ----- рисуем нисходящие "вилку" if(mFractals.Price[2]>mFractals.Price[1] && mFractals.Price[1]>mFractals.Price[0]) { string Name1="Line.Lower"+DoubleToStr(nLine.Lower,0); nLine.Lower++; string Name2="Line.Lower"+DoubleToStr(nLine.Lower,0); nLine.Lower++; ObjectCreate(Name1,OBJ_TREND,0,mFractals.DateTime[2],mFractals.Price[2],mFractals.DateTime[1],mFractals.Price[1]); ObjectCreate(Name2,OBJ_TREND,0,mFractals.DateTime[1],mFractals.Price[1],mFractals.DateTime[0],mFractals.Price[0]); if (ObjectGetValueByShift(Name1,nBar)>ObjectGetValueByShift(Name2,nBar)) { ObjectDelete(Name1); ObjectDelete(Name2); nLine.Lower--; nLine.Lower--; return(false); } ObjectSet(Name1,OBJPROP_COLOR,Color.LineLower); ObjectSet(Name2,OBJPROP_COLOR,Color.LineLower); ObjectSet(Name1,OBJPROP_WIDTH,Width.LineLower); ObjectSet(Name2,OBJPROP_WIDTH,Width.LineLower); ObjectSet(Name1,OBJPROP_RAY,True); ObjectSet(Name2,OBJPROP_RAY,True); CheckNumVilka(20); return(true); } return(false); } //+------------------------------------------------------------------+ bool isNewBar() { // Функция возвращает true, если появиться новый бар, иначе false if(nBars!=Bars) { nBars=Bars; return(true); } return(false); } //+------------------------------------------------------------------+ void CheckNumVilka(int Type) { // Функция проверяет допустимое количество вилок указанного типа int i; switch(Type) { case 10: //--------------------------------------------------------- 1 -- if(nLine.Upper<=nVilka.Upper*2) { mLineUpper.DateTime[nLine.Upper-2][0]=ObjectGet("Line.Upper"+(nLine.Upper-2),OBJPROP_TIME1); mLineUpper.DateTime[nLine.Upper-2][1]=ObjectGet("Line.Upper"+(nLine.Upper-2),OBJPROP_TIME2); mLineUpper.Price[nLine.Upper-2][0]=ObjectGet("Line.Upper"+(nLine.Upper-2),OBJPROP_PRICE1); mLineUpper.Price[nLine.Upper-2][1]=ObjectGet("Line.Upper"+(nLine.Upper-2),OBJPROP_PRICE2); //+------------------------------------------------------------------+ mLineUpper.DateTime[nLine.Upper-1][0]=ObjectGet("Line.Upper"+(nLine.Upper-1),OBJPROP_TIME1); mLineUpper.DateTime[nLine.Upper-1][1]=ObjectGet("Line.Upper"+(nLine.Upper-1),OBJPROP_TIME2); mLineUpper.Price[nLine.Upper-1][0]=ObjectGet("Line.Upper"+(nLine.Upper-1),OBJPROP_PRICE1); mLineUpper.Price[nLine.Upper-1][1]=ObjectGet("Line.Upper"+(nLine.Upper-1),OBJPROP_PRICE2); } //--------------------------------------------------------- 2 -- if(nLine.Upper >nVilka.Upper*2) { for (i=0; inVilka.Lower*2) { for (i=0; i