Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
//+------------------------------------------------------------------+ //| GANN_rvm_v4.mq4 | //| Copyright © 2005, MetaQuotes Software Corp. | //| http://www.metaquotes.net | //+------------------------------------------------------------------+ #property copyright "Copyright © 2005, MetaQuotes Software Corp." #property link "http://www.metaquotes.net" #property indicator_chart_window #property indicator_buffers 8 #property indicator_color1 DeepSkyBlue #property indicator_color2 Black #property indicator_color3 DeepSkyBlue #property indicator_color4 Black #property indicator_color5 Yellow #property indicator_color6 DarkSlateBlue #property indicator_color7 Red #property indicator_color8 Red //---- input parameters extern int NextTF=15; extern int BL_Range=5; extern int HLN_Range=3; extern bool HLN_UseFullTF=false; //---- buffers double HLNUp_sl[]; double HLNDn_sl[]; double HLNUp[]; double HLNDn[]; double BLLev[]; double BLStep[]; double ExtMapBuffer7[]; double ExtMapBuffer8[]; //---- int NextTFs; int initfl; int Displacement; int dig; int ArrSize; int ArrIdx; int lb,lBars; double MyArr[][10]; double oldValue; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- indicators SetIndexStyle(0,DRAW_LINE); SetIndexStyle(1,DRAW_LINE); SetIndexStyle(2,DRAW_LINE); SetIndexStyle(3,DRAW_LINE); SetIndexStyle(4,DRAW_LINE); SetIndexStyle(5,DRAW_LINE); SetIndexStyle(6,DRAW_LINE); SetIndexStyle(7,DRAW_LINE); SetIndexBuffer(0,HLNUp_sl); SetIndexBuffer(1,HLNDn_sl); SetIndexBuffer(2,HLNUp); SetIndexBuffer(3,HLNDn); SetIndexBuffer(4,BLLev); SetIndexBuffer(5,BLStep); SetIndexBuffer(6,ExtMapBuffer7); SetIndexBuffer(7,ExtMapBuffer8); SetIndexLabel(0,"HLNextUp_sec"); SetIndexLabel(1,"HLNextDn_sec"); SetIndexLabel(2,"HLNextUp"); SetIndexLabel(3,"HLNextDn"); SetIndexLabel(4,"BalansLevel"); SetIndexLabel(5,"BalansStep"); SetIndexLabel(6,"1"); SetIndexLabel(7,"2"); SetIndexEmptyValue(0,0.0); SetIndexEmptyValue(1,0.0); SetIndexEmptyValue(2,0.0); SetIndexEmptyValue(3,0.0); SetIndexEmptyValue(4,0.0); SetIndexEmptyValue(5,0.0); SetIndexEmptyValue(6,0.0); SetIndexEmptyValue(7,0.0); //---- NextTFs=NextTF*60; //---- return(0); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { int counted_bars=IndicatorCounted(); int cb,i,limit; //---- if( initfl!=1 ) { myInit(); if( initfl!=1 ) { Alert("Индикатор не инициализирован!"); return(-1); } } if( counted_bars>=0 ) { if( Bars-1-counted_bars<=0 ) { limit=0; } else { limit=Bars-1-counted_bars; } } else { Alert("Сбой! /n counted_bars < 0"); return(-1); } //цикл по барам for( cb=limit;cb>=0;cb-- ) { //если это первый бар if( cb==Bars-1 ) { if( FBar(cb)<0 ) { return(-1); } continue; } else { //если это новый бар if( lBars!=Bars || lb!=Bars-1-cb ) { lBars=Bars; lb=Bars-1-cb; //если он к тому же начало нового бара на старшем т-ф if( BBarBegin(cb,NextTF)!=1 ) { if( NewBar(cb)<0 ) { return(-1); } //если нулевая запись поменялась на новый бар if( oldValue!=MyArr[0][0] ) { if( cb==0 ) { Print(" изменение на новый бар "+oldValue+" "+MyArr[0][0]); oldValue=MyArr[0][0]; } } } else { if( NBBar(cb)<0 ) { return(-1); } //если нулевая запись поменялась на новый бар старшего т-ф if( oldValue!=MyArr[0][0] ) { if( cb==0 ) { Print(" изменение на новый бар старшего т-ф "+oldValue+" "+MyArr[0][0]); oldValue=MyArr[0][0]; } } } } else { if( NewTic(cb)<0 ) { return(-1); } //если нулевая запись поменялась на тик if( oldValue!=MyArr[0][0] ) { if( cb==0 ) { Print(" изменение на тик "+oldValue+" "+MyArr[0][0]); oldValue=MyArr[0][0]; } } } } } //---- return(0); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| Custor indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //+--------------------------------------------------------------------+ //| Функция возвращает истину, если бар является началом бара старшего | //| т-ф | //+--------------------------------------------------------------------+ bool BBarBegin(int bar, int TF) { //---- bool bbegin=0; if(TF!=10080) { if( MathFloor(Time[bar]/NextTFs)*NextTFs>Time[bar+1] ) { bbegin=1; } } else { if( (MathFloor((Time[bar]+259200)/NextTFs)*NextTFs-259200)>Time[bar+1] ) { bbegin=1; } } //---- return(bbegin); } //+--------------------------------------------------------------------+ //+------------------------------------------------------------------+ // Функция начальной инициализации индикатора | //+------------------------------------------------------------------+ void myInit() { int ArrSize,Displacement,arcount,i,BR; //---- //определяем количество баров младшего т-ф содержащихся в баре старшего т-ф if( NextTF<10080) { Displacement=NextTF/Period(); } else { if( NextTF==10080 ) { Displacement=7200/Period(); } else { if( NextTF==43200 ) { Displacement=31680/Period(); } } } //--------- SetIndexShift(0,Displacement); SetIndexShift(1,Displacement); SetIndexShift(4,Displacement); SetIndexShift(5,Displacement); SetIndexDrawBegin(0,Displacement*HLN_Range); SetIndexDrawBegin(1,Displacement*HLN_Range); SetIndexDrawBegin(2,Displacement*HLN_Range); SetIndexDrawBegin(3,Displacement*HLN_Range); SetIndexDrawBegin(5,0); SetIndexDrawBegin(6,Displacement*BL_Range); //--------- //если неверно указаны параметры BL_Range,HLN_Range if( BL_Range<1 || HLN_Range<1 ) { Alert("Неверно указаны параметры иникатора!"); return(-1); } BR=MathMax(BL_Range,HLN_Range); //если на графике недостаточно данных if( Bars<BR*Displacement ) { Alert("На графике недостаточно данных"); return(-1); } //если неверно указан параметр NextTF if( NextTF<=Period() ) { Alert("Неверно указан параметр NextTF !/n Значение должно быть больше /n текущего т-ф в минутах"); return(-1); } //количество знаков до которых будут округляться расчеты dig=Digits; //определяем необходимый размер массива и его последний индекс ArrSize=BR; ArrIdx=BR-1; //100 попыток на изменение размера массива for( i=0;i<100;i++) { arcount=ArrayResize(MyArr,ArrSize); if( arcount>0 ) { break; } } //100 попыток на инициализацию массива for( i=0;i<100;i++) { arcount=0; arcount=ArrayInitialize(MyArr,0.0); if( arcount>0 ) { break; } } initfl=1; //---- return(0); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| Функция отрабатывающая на каждый тик если это не новый бар | //+------------------------------------------------------------------+ int NewTic( int Bar ) { //---- int i; double sH,sL,sBL; if( High[Bar]>MyArr[ArrIdx][3] ) MyArr[ArrIdx][3]=High[Bar]; if( Low[Bar] <MyArr[ArrIdx][4] ) MyArr[ArrIdx][4]=Low[Bar]; MyArr[ArrIdx][5]=Close[Bar]; MyArr[ArrIdx][6]=NormalizeDouble((MyArr[ArrIdx][3]+MyArr[ArrIdx][4]+MyArr[ArrIdx][5])/3,dig); //цикл по массиву for( i=ArrIdx;i>=ArrIdx+1-BL_Range;i-- ) { sBL+=MyArr[i][6]; } MyArr[ArrIdx][7]=NormalizeDouble(sBL/BL_Range,dig); for( i=ArrIdx;i>=ArrIdx+1-HLN_Range;i-- ) { sH+=MyArr[i][3]; sL+=MyArr[i][4]; } MyArr[ArrIdx][8]=NormalizeDouble(sH/HLN_Range,dig); MyArr[ArrIdx][9]=NormalizeDouble(sL/HLN_Range,dig); //отрисовываем на графике for( i=Bars-1-MyArr[ArrIdx][0];i>=Bars-1-MyArr[ArrIdx][1];i-- ) { BLLev[i]=MyArr[ArrIdx][6]; BLStep[i]=MyArr[ArrIdx][7]; HLNUp_sl[i]=MyArr[ArrIdx][8]; HLNDn_sl[i]=MyArr[ArrIdx][9]; } if( MyArr[ArrIdx][2]<=0 || MyArr[ArrIdx][3]<=0 || MyArr[ArrIdx][4]<=0 || MyArr[ArrIdx][5]<=0 || MyArr[ArrIdx][6]<=0 || BLLev[Bar]<=0 ) { Alert("Сбой расчета индикатора на новом тике!"); return(-1); } //---- return(0); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| Функция отрабатывающая на первый бар на графике | //+------------------------------------------------------------------+ int FBar( int Bar ) { //---- //начинаем записывать в массив MyArr[ArrIdx][0]=Bars-1-Bar; MyArr[ArrIdx][1]=Bars-1-Bar; MyArr[ArrIdx][2]=Open[Bar]; MyArr[ArrIdx][3]=High[Bar]; MyArr[ArrIdx][4]=Low[Bar]; MyArr[ArrIdx][5]=Close[Bar]; MyArr[ArrIdx][6]=NormalizeDouble((MyArr[ArrIdx][3]+MyArr[ArrIdx][4]+MyArr[ArrIdx][5])/3,dig); BLLev[Bar]=MyArr[ArrIdx][6]; if( MyArr[ArrIdx][2]<=0 || MyArr[ArrIdx][3]<=0 || MyArr[ArrIdx][4]<=0 || MyArr[ArrIdx][5]<=0 || MyArr[ArrIdx][6]<=0 || BLLev[Bar]<=0 ) { Alert("Ошибка просчета 1 бара!"); return(-1); } //---- return(0); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| Функция отрабатывающая при появлении нового бара 1 раз | //+------------------------------------------------------------------+ int NewBar( int Bar ) { //---- int i; double sH,sL,sBL; MyArr[ArrIdx][1]=Bars-1-Bar; if( High[Bar]>MyArr[ArrIdx][3] ) MyArr[ArrIdx][3]=High[Bar]; if( Low[Bar] <MyArr[ArrIdx][4] ) MyArr[ArrIdx][4]=Low[Bar]; MyArr[ArrIdx][5]=Close[Bar]; MyArr[ArrIdx][6]=NormalizeDouble((MyArr[ArrIdx][3]+MyArr[ArrIdx][4]+MyArr[ArrIdx][5])/3,dig); //цикл по массиву for( i=ArrIdx;i>=ArrIdx+1-BL_Range;i-- ) { sBL+=MyArr[i][6]; } MyArr[ArrIdx][7]=NormalizeDouble(sBL/BL_Range,dig); for( i=ArrIdx;i>=ArrIdx+1-HLN_Range;i-- ) { sH+=MyArr[i][3]; sL+=MyArr[i][4]; } MyArr[ArrIdx][8]=NormalizeDouble(sH/HLN_Range,dig); MyArr[ArrIdx][9]=NormalizeDouble(sL/HLN_Range,dig); //отрисовываем на графике for( i=Bars-1-MyArr[ArrIdx][0];i>=Bars-1-MyArr[ArrIdx][1];i-- ) { BLLev[i]=MyArr[ArrIdx][6]; BLStep[i]=MyArr[ArrIdx][7]; HLNUp_sl[i]=MyArr[ArrIdx][8]; HLNDn_sl[i]=MyArr[ArrIdx][9]; } if( MyArr[ArrIdx][2]<=0 || MyArr[ArrIdx][3]<=0 || MyArr[ArrIdx][4]<=0 || MyArr[ArrIdx][5]<=0 || MyArr[ArrIdx][6]<=0 || BLLev[Bar]<=0 ) { Alert("Ошибка просчета нового бара!"); return(-1); } //---- return(0); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| Функция отрабатывающая при появлении нового бара старшего т-ф | //+------------------------------------------------------------------+ int NBBar( int Bar ) { //---- int i; double sH,sL,sBL; //сдиг по стеку в массиве for( i=0;i<ArrIdx;i++) { MyArr[i][0]=MyArr[i+1][0]; MyArr[i][1]=MyArr[i+1][1]; MyArr[i][2]=MyArr[i+1][2]; MyArr[i][3]=MyArr[i+1][3]; MyArr[i][4]=MyArr[i+1][4]; MyArr[i][5]=MyArr[i+1][5]; MyArr[i][6]=MyArr[i+1][6]; MyArr[i][7]=MyArr[i+1][7]; MyArr[i][8]=MyArr[i+1][8]; MyArr[i][9]=MyArr[i+1][9]; } MyArr[ArrIdx][0]=Bars-1-Bar; MyArr[ArrIdx][1]=Bars-1-Bar; MyArr[ArrIdx][2]=Open[Bar]; MyArr[ArrIdx][3]=High[Bar]; MyArr[ArrIdx][4]=Low[Bar]; MyArr[ArrIdx][5]=Close[Bar]; MyArr[ArrIdx][6]=NormalizeDouble((MyArr[ArrIdx][3]+MyArr[ArrIdx][4]+MyArr[ArrIdx][5])/3,dig); //цикл по массиву for( i=ArrIdx;i>=ArrIdx+1-BL_Range;i-- ) { sBL+=MyArr[i][6]; } MyArr[ArrIdx][7]=NormalizeDouble(sBL/BL_Range,dig); for( i=ArrIdx;i>=ArrIdx+1-HLN_Range;i-- ) { sH+=MyArr[i][3]; sL+=MyArr[i][4]; } MyArr[ArrIdx][8]=NormalizeDouble(sH/HLN_Range,dig); MyArr[ArrIdx][9]=NormalizeDouble(sL/HLN_Range,dig); //отрисовываем на графике BLLev[Bar]=MyArr[ArrIdx][6]; BLStep[Bar]=MyArr[ArrIdx][7]; HLNUp_sl[Bar]=MyArr[ArrIdx][8]; HLNDn_sl[Bar]=MyArr[ArrIdx][9]; if( MyArr[ArrIdx][2]<=0 || MyArr[ArrIdx][3]<=0 || MyArr[ArrIdx][4]<=0 || MyArr[ArrIdx][5]<=0 || MyArr[ArrIdx][6]<=0 || BLLev[Bar]<=0 ) { Alert("Ошибка просчета нового бара старшего т-ф!"); return(-1); } //---- return(0); } //+------------------------------------------------------------------+