//+------------------------------------------------------------------+ //| Diver.mq4 | //| Mishell | //| Функции определяющие наличие дивергеенции и ее вид | //+------------------------------------------------------------------+ #property copyright "Mishell" #property link "" #property library int sAddpips; int bAddpips; int BearsPeriod=13; int BullsPeriod=13; // ----- Константы-сигналы ------ int Div; // Счетчик дивергенций int Div1Bar; int Div2Bar; int Div3Bar; int Div1Wave; // номер пика индикатора силы быков для дивергенции 1 int Div2Wave; int Div3Wave; int Div1Main=0; int Conv; //Счетчик конвергенций int Conv1Bar; int Conv2Bar; int Conv3Bar; int Conv1Wave; // номер пика индикатора силы медведей для конвергенции 1 int Conv2Wave; int Conv3Wave; int BeginBar; // бар от которого ищется дивергенция int BeginBarDown;// бар от которого ищется конвергенция int ContinueBar;// текущий бар поиска дивергенции int ContinueBarDown; //текущий бар поиска конвергенции int UpWaveNum=0 ; // счетчик вершин BullsPower int DownWaveNum=0 ; // счетчик ям BearsPower //+--------------------------------------------------------------------------+ //| Определение наличия сигнала о смене восходящего тренда или начале отката //+--------------------------------------------------------------------------+ int BreackUpTrendCondition (int TimeFrame, int MaxWaveNum) { int TopBar;// текущий проверяемый бар // Print("Begin div while"); TopBar=ContinueBar; // //Провеляем наличие дивергенции while (! ( ((iHigh(NULL,TimeFrame,BeginBar)+sAddpips*Point)>=iHigh(NULL,TimeFrame,TopBar) && iBullsPower( NULL, TimeFrame, BullsPeriod, PRICE_CLOSE, BeginBar)< iBullsPower( NULL, TimeFrame, BullsPeriod, PRICE_CLOSE, TopBar)) || (UpWaveNum==MaxWaveNum || iBullsPower( NULL, TimeFrame, BullsPeriod, PRICE_CLOSE, TopBar)<0) ) ) { //while //Дивергенци нет. Тогда, // Если мы нашли пик индикатора, то увеличиваем счетчик пиков на 1 if ( (iBullsPower( NULL, TimeFrame, BullsPeriod, PRICE_CLOSE, TopBar)> iBullsPower( NULL, TimeFrame, BullsPeriod, PRICE_CLOSE, TopBar-1) && iBullsPower( NULL, TimeFrame, BullsPeriod, PRICE_CLOSE, TopBar)> iBullsPower( NULL, TimeFrame, BullsPeriod, PRICE_CLOSE, TopBar+1)) ) {//1 UpWaveNum++ ; }//1 // Если же пика нет, // при условии, что счетчик "бычьих" пиков = 0 и движение от соседнего бара - нисходящее // устанавливаем этот соседний бар как начальный else if ( (UpWaveNum==0 && Div==0) && (iBullsPower(NULL, TimeFrame, BullsPeriod, PRICE_CLOSE, BeginBar)< iBullsPower(NULL, TimeFrame, BullsPeriod, PRICE_CLOSE, BeginBar+1) ) ) { BeginBar++; } TopBar++; //переходим на следующий бар }//while if (UpWaveNum< MaxWaveNum ) {//Если дивергенция найдена увеличиваем счетчик дивергенции Div++; // Проверяем не пик ли это индикатора if ( (iBullsPower( NULL, TimeFrame, BullsPeriod, PRICE_CLOSE, TopBar)> iBullsPower( NULL, TimeFrame, BullsPeriod, PRICE_CLOSE, TopBar-1) && iBullsPower( NULL, TimeFrame, BullsPeriod, PRICE_CLOSE, TopBar)> iBullsPower( NULL, TimeFrame, BullsPeriod, PRICE_CLOSE, TopBar+1)) ) UpWaveNum++ ; switch(Div) {//sw case 1 : Div1Bar=TopBar; Div1Wave=UpWaveNum; break; case 2 : Div2Bar=TopBar; Div2Wave=UpWaveNum; break; case 3 : Div3Bar=TopBar; Div3Wave=UpWaveNum; break; }//switch }//div //--------------------- return(TopBar); //--------------------- } //+--------------------------------------------------------------------------+ //| Определение наличия сигнала о смене нисходящего тренда или начале отката //+--------------------------------------------------------------------------+ int BreackDownTrendCondition (int TimeFrame, int WaveNum) { int TopBar; // Print("Begin conv while"); TopBar=ContinueBarDown; // while (!( (iLow(NULL,TimeFrame,BeginBarDown)-bAddpips*Point<=iLow(NULL, TimeFrame,TopBar) && iBearsPower( NULL, TimeFrame, BearsPeriod, PRICE_CLOSE, BeginBarDown)> iBearsPower( NULL, TimeFrame, BearsPeriod, PRICE_CLOSE, TopBar)) || ( DownWaveNum==WaveNum //cWaveTopNum || iBearsPower( NULL, TimeFrame, BearsPeriod, PRICE_CLOSE, TopBar)>0) )) { if ( (iBearsPower( NULL, TimeFrame, BearsPeriod, PRICE_CLOSE, TopBar)< iBearsPower( NULL, TimeFrame, BearsPeriod, PRICE_CLOSE, TopBar-1) && iBearsPower( NULL, TimeFrame, BearsPeriod, PRICE_CLOSE, TopBar)< iBearsPower( NULL, TimeFrame, BearsPeriod, PRICE_CLOSE, TopBar+1)) ) { DownWaveNum++ ; } else if (DownWaveNum==0 && Conv==0 && (iBearsPower( NULL, TimeFrame, BearsPeriod, PRICE_CLOSE, BeginBarDown)> iBearsPower( NULL, TimeFrame, BearsPeriod, PRICE_CLOSE, BeginBarDown+1) )) {BeginBarDown++;} TopBar++; } if (DownWaveNum2 || iBullsPower( NULL, TimeFrame, BullsPeriod, PRICE_CLOSE,BullDivBar)<0 ) ) { BullDivBar=BreackUpTrendCondition (TimeFrame, MaxWaveNum);//находим бар дивергенции //устанавливаем сопутствующие сигнальные переменные ContinueBar=BullDivBar+1;//устанавливаем бар для следующего поиска дивергенции }//end while // Итоговые сообщения if (UpWaveNum < MaxWaveNum && Div>0) { // Alert(Symbol(),"Дивег1:Бар № ",Div1Bar," волна ",Div1Wave,";Дивег2:Бар № ",Div2Bar," волна ",Div2Wave, // ";Дивег3:Бар № ",Div3Bar," волна ",Div3Wave," Начальный бар=",BeginBar); return(true); } else return(false); } //+------------------------------------------------------------------+ // Ищем конвергенцию //+------------------------------------------------------------------+ bool SeachConv(int TimeFrame, int cMaxWaveNum, int StartBar=0) { int BearConvBar=0; //Бар конвергенции медведей //Print("Начало большого цикла поиска ковергенции"); cinstall(StartBar); while (!( DownWaveNum==cMaxWaveNum || Conv>2 || iBearsPower( NULL, TimeFrame, BearsPeriod, PRICE_CLOSE,BearConvBar)>0 ) //iBearsPower( NULL, TimeFrame, BearsPeriod, PRICE_CLOSE,ContinueBarDown)>0 )//пропускает "утопленных" медведей ) { BearConvBar=BreackDownTrendCondition(TimeFrame, cMaxWaveNum ); ContinueBarDown=BearConvBar+1; }//end while // Итоговые сообщения if (DownWaveNum0) { // Alert(Symbol()," ",TimeFrame," ",buyADX," ",WaitUp ," Конвег1:Бар № ",Conv1Bar," волна ",Conv1Wave,";Конвег2:Бар № ",Conv2Bar, // " волна ",Conv2Wave,";Конвег3:Бар № ",Conv3Bar," волна ",Conv3Wave," Начальный бар=",BeginBarDown); return(true); } else return(false); } bool DiverKind(int SeekBar, int TimeFrame) {double MetaClose; if (SeekBar==0) MetaClose=Close[0]+sAddpips*Point; else MetaClose = iHigh(NULL,TimeFrame,SeekBar)+sAddpips*Point; if( BeginBariHigh(NULL,TimeFrame,Highest(NULL,TimeFrame,MODE_HIGH,Div1Bar,1)) && Div1Bar==Highest(NULL,TimeFrame,MODE_HIGH,3,Div1Bar-1) ) || (Div==2 && MetaClose>iHigh(NULL,TimeFrame,Highest(NULL,TimeFrame,MODE_HIGH,Div2Bar,1)) && (Div2Bar==Highest(NULL,TimeFrame,MODE_HIGH,3,Div2Bar-1) || Div1Bar==Highest(NULL,TimeFrame,MODE_HIGH,3,Div1Bar-1) ) ) || (Div>=3 && MetaClose>iHigh(NULL,TimeFrame,Highest(NULL,TimeFrame,MODE_HIGH,Div3Bar,1) ) && (Div2Bar==Highest(NULL,TimeFrame,MODE_HIGH,3,Div2Bar-1) //&& || Div3Bar==Highest(NULL,TimeFrame,MODE_HIGH,3,Div3Bar-1) ) ) )//1&& ) return(true); else return(false); } //+------------------------------------------------------------------+ // Требования к конвергенции //+------------------------------------------------------------------+ bool ConvKind(int SeekBar, int TimeFrame) { double lowLevel; if (SeekBar==0) lowLevel=Close[0]-bAddpips*Point; else lowLevel=iLow(NULL,TimeFrame,SeekBar)-bAddpips*Point; if ( BeginBarDown2 //2 && lowLevel< iLow(NULL,TimeFrame,Lowest(NULL,TimeFrame,MODE_LOW,Conv3Bar,SeekBar+1)) && (//3 Conv1Bar==Lowest(NULL,TimeFrame,MODE_LOW,3,Conv1Bar-1) || Conv2Bar==Lowest(NULL,TimeFrame,MODE_LOW,3,Conv2Bar-1) || Conv3Bar==Lowest(NULL,TimeFrame,MODE_LOW,3,Conv3Bar-1) )//3 )//2 )//1 ) return(true); else return(false); } //+------------------------------------------------------------------+ //| expert initialization variables | //+------------------------------------------------------------------+ void dinstall(int StrBar) { Div=0; // Изначально считаем, что дивиргенции нет Div1Bar=0; Div2Bar=0; Div3Bar=0; Div1Wave=0; // номер волны дивергенции 1 Div2Wave=0; // номер волны дивергенции 2 Div3Wave=0; // номер волны дивергенции 3 UpWaveNum=0 ; //=== бары с которыми определяются дивергенция и конвергенция === BeginBar=StrBar; ContinueBar=BeginBar+1; return; } void cinstall(int StrBar) { Conv =0 ; Conv1Bar=0; Conv2Bar=0; Conv3Bar=0; Conv1Wave=0 ; // номер волны конвергенции 1 Conv2Wave=0; // номер волны конвергенции 2 Conv3Wave=0; // номер волны конвергенции 3 DownWaveNum=0 ; BeginBarDown=StrBar; ContinueBarDown=StrBar+1; return; } void AddpipsInit(int spips,int bpips) { sAddpips=spips; bAddpips=bpips; return; } void PeriodInit(int P1,int P2) { BearsPeriod=P1; BullsPeriod=P2; return; } //+------------------------------------------------------------------+