//+------------------------------------------------------------------+ //| Boa_ZigZag_Fibo_Grand_xN_Stat.mq5 | //| Copyright © 2005, MetaQuotes Software Corp. | //| mandorr@gmail.com | //+------------------------------------------------------------------+ //---- авторство индикатора #property copyright "Copyright © 2005, MetaQuotes Software Corp." //---- ссылка на сайт автора #property link "mandorr@gmail.com" //---- номер версии индикатора #property version "1.10" #property description "Казахский удав" //---- отрисовка индикатора в главном окне #property indicator_chart_window //---- для расчёта и отрисовки индикатора использовано два буфера #property indicator_buffers 2 //---- использовано всего 2 графических построения #property indicator_plots 1 //+----------------------------------------------+ //| объявление констант | //+----------------------------------------------+ #define FIBO_LINES_TOTAL 7 // Константа для количества уровней фибо //+----------------------------------------------+ //| Параметры отрисовки индикатора | //+----------------------------------------------+ //---- в качестве индикатора использован зигзаг секциями #property indicator_type1 DRAW_COLOR_SECTION //---- отображение метки индикатора #property indicator_label1 "Boa_ZigZag" //---- в качестве цвета линии индикатора использованы #property indicator_color1 clrMediumOrchid,clrLimeGreen //---- линия индикатора - длинный пунктир #property indicator_style1 STYLE_SOLID //---- толщина линии индикатора равна 3 #property indicator_width1 3 //+----------------------------------------------+ //| Входные параметры индикатора | //+----------------------------------------------+ input uint Length=6; input string FiboName="Fibo_Grand_xN"; //Имя Фибо-объекта input double FiboRatio =1.000; //Коэффициент домножения всех фибоуровней input double FiboLevelsShift=0.000; //Сдвиг по вертикали всех фибоуровней в Фибах от нулевого уровня input uint FiboTotal=3; //Количество дополнительных секторов Фибо сверху или снизу input color FiboColor=clrRed; //Цвет Фибо input uint FiboWidth=4; //толщина линии Фибо //---- input double FiboLevel1 =0.000; //значение фибоуровня 1 input ENUM_LINE_STYLE StyleLevel1=STYLE_SOLID; //стиль линии фибоуровня 1 input uint WidthLevel1=4; //толщина линии фибоуровня 1 input color Color_Level1 = clrDarkViolet; //цвет фибоуровня 1 //---- input double FiboLevel2=0.236; //значение фибоуровня 2 input ENUM_LINE_STYLE StyleLevel2=STYLE_SOLID; //стиль линии фибоуровня 2 input uint WidthLevel2=1; //толщина линии фибоуровня 2 input color Color_Level2= clrDarkViolet; //цвет фибоуровня 2 //---- input double FiboLevel3 =0.382; //значение фибоуровня 3 input ENUM_LINE_STYLE StyleLevel3=STYLE_DASH; //стиль линии фибоуровня 3 input uint WidthLevel3=1; //толщина линии фибоуровня 3 input color Color_Level3 = clrOrange; //цвет фибоуровня 3 //---- input double FiboLevel4 =0.500; //значение фибоуровня 4 input ENUM_LINE_STYLE StyleLevel4=STYLE_SOLID; //стиль линии фибоуровня 4 input uint WidthLevel4=2; //толщина линии фибоуровня 4 input color Color_Level4 = clrMagenta; //цвет фибоуровня 4 //---- input double FiboLevel5 =0.618; //значение фибоуровня 5 input ENUM_LINE_STYLE StyleLevel5=STYLE_DASH; //стиль линии фибоуровня 5 input uint WidthLevel5=1; //толщина линии фибоуровня 5 input color Color_Level5 = clrBlue; //цвет фибоуровня 5 //---- input double FiboLevel6=0.764; //значение фибоуровня 6 input ENUM_LINE_STYLE StyleLevel6=STYLE_SOLID; //стиль линии фибоуровня 6 input uint WidthLevel6=1; //толщина линии фибоуровня 6 input color Color_Level6 = clrGray; //цвет фибоуровня 6 //---- input double FiboLevel7 = 1.000; //значение фибоуровня 7 input ENUM_LINE_STYLE StyleLevel7=STYLE_SOLID; //стиль линии фибоуровня 7 input uint WidthLevel7=4; //толщина линии фибоуровня 7 input color Color_Level7 = clrDarkViolet; //цвет фибоуровня 7 //---- input bool Fibo_AsRay=true; //отрисовка луча input uint CB=500; //Количество баров для расчёта зигзага //+----------------------------------------------+ #define FIBO_LINES_TOTAL_XN_FULL FIBO_LINES_TOTAL*(1+FiboTotal*2)-FiboTotal*2 // Константа для количества уровней фибо //---- массивы переменных для линий Фибо double Values[]; color Colors[]; ENUM_LINE_STYLE Styles[]; uint Widths[]; //---- объявление динамических массивов, которые будут в дальнейшем использованы в качестве индикаторных буферов double IndBuffer[],ColorIndBuffer[]; //---- Объявление целых переменных начала отсчёта данных int min_rates_total; //---- double h,l; bool cur_h,cur_l; bool draw_up,draw_dn,initfl; int fPoint_i,sPoint_i,s_up,s_dn,drawf,lb,cb; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //---- Инициализация переменных начала отсчёта данных min_rates_total=int(Length)+1; cb=int(MathMax(min_rates_total,CB)); //---- превращение динамических массивов в индикаторные буферы SetIndexBuffer(0,IndBuffer,INDICATOR_DATA); SetIndexBuffer(1,ColorIndBuffer,INDICATOR_COLOR_INDEX); //---- запрет на отрисовку индикатором пустых значений PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0); //---- индексация элементов в буферах как в таймсериях ArraySetAsSeries(IndBuffer,true); ArraySetAsSeries(ColorIndBuffer,true); //---- установка позиции, с которой начинается отрисовка уровней Боллинджера PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,min_rates_total); //---- Установка формата точности отображения индикатора IndicatorSetInteger(INDICATOR_DIGITS,_Digits); //---- имя для окон данных и лэйба для субъокон string shortname; StringConcatenate(shortname,"Boa_ZigZag_Fibo_Grand_xN_Stat(Length=",Length,")"); IndicatorSetString(INDICATOR_SHORTNAME,shortname); //---- ArrayResize(Values,FIBO_LINES_TOTAL_XN_FULL); ArrayResize(Colors,FIBO_LINES_TOTAL_XN_FULL); ArrayResize(Styles,FIBO_LINES_TOTAL_XN_FULL); ArrayResize(Widths,FIBO_LINES_TOTAL_XN_FULL); //---- Values[0]=FiboLevel1*FiboRatio; Values[1]=FiboLevel2*FiboRatio; Values[2]=FiboLevel3*FiboRatio; Values[3]=FiboLevel4*FiboRatio; Values[4]=FiboLevel5*FiboRatio; Values[5]=FiboLevel6*FiboRatio; Values[6]=FiboLevel7*FiboRatio; //---- Colors[0]=Color_Level1; Colors[1]=Color_Level2; Colors[2]=Color_Level3; Colors[3]=Color_Level4; Colors[4]=Color_Level5; Colors[5]=Color_Level6; Colors[6]=Color_Level7; //---- Styles[0]=StyleLevel1; Styles[1]=StyleLevel2; Styles[2]=StyleLevel3; Styles[3]=StyleLevel4; Styles[4]=StyleLevel5; Styles[5]=StyleLevel6; Styles[6]=StyleLevel7; //---- Widths[0]=WidthLevel1; Widths[1]=WidthLevel2; Widths[2]=WidthLevel3; Widths[3]=WidthLevel4; Widths[4]=WidthLevel5; Widths[5]=WidthLevel6; Widths[6]=WidthLevel7; //---- for(int count=1; count<=int(FiboTotal); count++) for(int lev=1; lev<7; lev++) { int kkk=lev+6*(2*count-1); Values[kkk]=Values[lev]+count; Colors[kkk]=Colors[lev]; Styles[kkk]=Styles[lev]; Widths[kkk]=Widths[lev]; //---- kkk=lev+6*(2*count); Values[kkk]=-Values[7-lev]-count+1; Colors[kkk]=Colors[lev-1]; Styles[kkk]=Styles[lev-1]; Widths[kkk]=Widths[lev-1]; } //--- создадим объект if(!FiboLevelsCreate(0,FiboName,0,0,0,0,0,FiboColor,STYLE_SOLID,FiboWidth,false,false,false,Fibo_AsRay,false,0)) { Print("Не удалось создать Фибо!"); return(INIT_FAILED); } if(!FiboLevelsSet(FIBO_LINES_TOTAL_XN_FULL,Values,Colors,Styles,Widths,0,FiboName)) { Print("Не удалось настроить Фибо!"); return(INIT_FAILED); } //--- завершение инициализации return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //---- FiboLevelsDelete(0,FiboName); //---- ChartRedraw(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ 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[]) { //---- проверка количества баров на достаточность для расчёта if(rates_total=0 && !IsStopped(); bar--) { IndBuffer[bar]=NULL; HH=high[ArrayMaximum(high,bar+1,Length)]; LL=low[ArrayMinimum(low,bar+1,Length)]; if (low[bar]HH) { Swing=2; if (Swing_n== 1) zu=bar+1; if (Swing_n==-1) zd=bar+1; } else { if (low [bar]HH) Swing= 1; } if (Swing!=Swing_n && Swing_n!=0) { if (Swing== 2) {Swing=-Swing_n; BH=high[bar]; BL=low[bar];} if (Swing== 1) IndBuffer[zd]=BL; if (Swing==-1) IndBuffer[zu]=BH; BH=high[bar]; BL=low [bar]; } if (Swing== 1) {if (high[bar]>=BH) {BH=high[bar]; zu=bar;}} if (Swing==-1) {if (low [bar]<=BL) {BL=low [bar]; zd=bar;}} Swing_n=Swing; } //---- Второй большой цикл раскраски индикатора for(bar=climit; bar>=0 && !IsStopped(); bar--) { if(!IndBuffer[bar]) ColorIndBuffer[bar]=ColorIndBuffer[bar+1]; if(IndBuffer[bar]&& IndBuffer[bar]>high[bar+1]) ColorIndBuffer[bar]=1; if(IndBuffer[bar] && IndBuffer[bar]