Ты выложил подстрочник из МТ3. Я его сделал более правильно. Принцип действия индикатора описывал на пауке в ветке "Индикатор для МТ4", страница 10-20 , где-то там, точно не помню.
//+------------------------------------------------------------------+
//| HL Next Activator.mq4 |
//| Rosh |
//| http://fx.winm.ru/book.htm |
//+------------------------------------------------------------------+
#property copyright "Rosh"
#property link "http://fx.winm.ru/book.htm"
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Blue
#property indicator_color2 Red
//---- input parameters
extern int ActivatorPeriod=3;
extern int useFullPeriods=1;
//---- buffers
double SellActivator[];
double BuyActivator[];
int first,counterPeriod;
int DelimeterArray[30];
//+------------------------------------------------------------------+
//| Получим следующий период |
//+------------------------------------------------------------------+
string GetNextPeriod(int _Period)
{
string nextPeriod="";
//----
switch (_Period)
{
case 5: nextPeriod="H1"; break;
case 15: nextPeriod="H1"; break;
case 30: nextPeriod="H4"; break;
case 60: nextPeriod="H4"; break;
case 240: nextPeriod="D1"; break;
case 1440: nextPeriod="W1"; break;
case 10080: nextPeriod="M"; break;
default: Print("Недопустимый период!!!");
}
//----
return(nextPeriod);
}
//+------------------------------------------------------------------+
//| Проверим - разделитель диапазона или нет |
//+------------------------------------------------------------------+
bool isDelimeter(int _Period, int _shift)
{
bool result=false;
//----
switch (_Period)
{
case 5:result=(TimeMinute(Time[_shift])==0); break;
case 15:result=(TimeMinute(Time[_shift])==0); break;
case 30:result=(TimeMinute(Time[_shift])==0)&& MathMod(TimeHour(Time[_shift]),4.0)==0.0; break;
case 60:result=(TimeMinute(Time[_shift])==0)&& MathMod(TimeHour(Time[_shift]),4.0)==0.0;break;
case 240:result=(TimeMinute(Time[_shift])==0)&&(TimeHour(Time[_shift])==0); break;
case 1440:result=(TimeDayOfWeek(Time[_shift])==1)&&(TimeHour(Time[_shift])==0); break;
case 10080:result=(TimeDay(Time[_shift])==1)||((TimeDay(Time[_shift])==2 && TimeDay(Time[_shift+1])!=1))||((TimeDay(Time[_shift])==3 && TimeDay(Time[_shift+1])!=2)); break;
default: Print("Недопустимый период!!!");
}
//----
return(result);
}
//+------------------------------------------------------------------+
//| Вычислить средний High за ActivatorPeriod периодов |
//+------------------------------------------------------------------+
double AverageHigh(int _shift)
{
double AveragePeriodHigh=0.0,tempHigh;
int cnt=_shift;
first=0;
//----
counterPeriod=0;
while (counterPeriod<ActivatorPeriod+useFullPeriods)
{
while (!isDelimeter(Period(),cnt)) cnt++;
if (first==0) first=cnt;
DelimeterArray[counterPeriod]=cnt;
cnt++;
counterPeriod++;
}
cnt--;
for (cnt=ActivatorPeriod-1;cnt>0;cnt--)
{
tempHigh=High[Highest(NULL,0,MODE_HIGH,DelimeterArray[cnt]-DelimeterArray[cnt-1],DelimeterArray[cnt-1]+1)];
AveragePeriodHigh=AveragePeriodHigh+tempHigh;
}
if (useFullPeriods==1)
{
tempHigh=High[Highest(NULL,0,MODE_HIGH,DelimeterArray[ActivatorPeriod]-DelimeterArray[ActivatorPeriod-1],DelimeterArray[ActivatorPeriod-1]+1)];
AveragePeriodHigh=AveragePeriodHigh+tempHigh;
AveragePeriodHigh=AveragePeriodHigh/NormalizeDouble(ActivatorPeriod,0);
}
else
{
tempHigh=High[Highest(NULL,0,MODE_HIGH,DelimeterArray[0]-_shift,_shift)];
AveragePeriodHigh=AveragePeriodHigh+tempHigh;
AveragePeriodHigh=AveragePeriodHigh/NormalizeDouble(ActivatorPeriod,0);
}
//----
return(AveragePeriodHigh);
}
//+------------------------------------------------------------------+
//| Вычислить средний Low за ActivatorPeriod периодов |
//+------------------------------------------------------------------+
double AverageLow(int _shift)
{
double AveragePeriodLow=0.0,tempLow;
int cnt=_shift;
first=0;
//----
counterPeriod=0;
while (counterPeriod<ActivatorPeriod+useFullPeriods)
{
while (!isDelimeter(Period(),cnt)) cnt++;
if (first==0) first=cnt;
DelimeterArray[counterPeriod]=cnt;
cnt++;
counterPeriod++;
}
cnt--;
for (cnt=ActivatorPeriod-1;cnt>0;cnt--)
{
tempLow=Low[Lowest(NULL,0,MODE_LOW,DelimeterArray[cnt]-DelimeterArray[cnt-1],DelimeterArray[cnt-1]+1)];
AveragePeriodLow=AveragePeriodLow+tempLow;
}
if (useFullPeriods==1)
{
tempLow=Low[Lowest(NULL,0,MODE_LOW,DelimeterArray[ActivatorPeriod]-DelimeterArray[ActivatorPeriod-1],DelimeterArray[ActivatorPeriod-1]+1)];
AveragePeriodLow=AveragePeriodLow+tempLow;
AveragePeriodLow=AveragePeriodLow/NormalizeDouble(ActivatorPeriod,0);
}
else
{
tempLow=Low[Lowest(NULL,0,MODE_LOW,DelimeterArray[0]-_shift,_shift)];
AveragePeriodLow=AveragePeriodLow+tempLow;
AveragePeriodLow=AveragePeriodLow/NormalizeDouble(ActivatorPeriod,0);
}
//----
return(AveragePeriodLow);
}
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicators
SetIndexStyle(0,DRAW_ARROW);
SetIndexArrow(0,159);
SetIndexBuffer(0,SellActivator);
SetIndexEmptyValue(0,0.0);
SetIndexStyle(1,DRAW_ARROW);
SetIndexArrow(1,159);
SetIndexBuffer(1,BuyActivator);
SetIndexEmptyValue(1,0.0);
if (useFullPeriods!=0) useFullPeriods=1;
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int counted_bars=IndicatorCounted();
int cnt,limit;
if (Period()==10080) return;
if (counted_bars<0) return(-1);
if (counted_bars>0) limit=Bars-counted_bars;
if (counted_bars==0)
{
// найти первый и второй разделитель и установить limit
cnt=Bars-1;
while (!isDelimeter(Period(),cnt)) cnt--;
first=cnt;
cnt--;
counterPeriod=0;
while (counterPeriod<ActivatorPeriod)
{
while (!isDelimeter(Period(),cnt)) cnt--;
cnt--;
counterPeriod++;
}
cnt++;
limit=cnt;
}
//----
for (int shift=limit;shift>=0;shift--)
{
if (Close[shift]>AverageHigh(shift))
{
SellActivator[shift]=AverageLow(shift);
BuyActivator[shift]=0.0;
continue;
}
if (Close[shift]<AverageLow(shift))
{
BuyActivator[shift]=AverageHigh(shift);
SellActivator[shift]=0.0;
continue;
}
if (BuyActivator[shift+1]!=0.0) BuyActivator[shift]=AverageHigh(shift);
if (SellActivator[shift+1]!=0.0) SellActivator[shift]=AverageLow(shift);
}
//----
return(0);
}
//+------------------------------------------------------------------+
Мне при компиляции выводится предупреждение "Function "GetNextPeriod" is not referenced and will be removed from exp-file " - можно это исправить?
говорили же разработчикам - сделайте описание ошибок на русском =)))это исправлять совсем не обязательно - просто ф-ция не используется и всё. Ничего критического )
Да, так и есть, в переводе на русский компилятор говорит, что вызовы на данную функцию в коде не обнаружены и поэтому она будет удалена из исполняемого файла.
А зачем я сделал эту функцию (то есть где собирался ее использовать) я уже и не помню.
А зачем я сделал эту функцию (то есть где собирался ее использовать) я уже и не помню.
упс =) давненько я не обновлялся =)))
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Есть индюк HL_Actevator_next.
Подскажите принцип его работы на разных таймфреймах, может надо в коде что-то подправить?
Он неплохо определяет среднесрочную тенденцию (Н4), но сигналы появляются как-то "косо".
На Н4 есть - стало быть на Н1 тоже должен быть, но его нет.
Может сделать его более чувствительным к изменения цены, потому что сигнал поступает тогда, когда уже закрылось пара-тройка свечей, а то и больше.
Заранее благодарен!
//+------------------------------------------------------------------+ //| HL_Actevator_next.mq4 | //| | //| Conversion only | //+------------------------------------------------------------------+ #property indicator_chart_window #property indicator_buffers 2 #property indicator_color1 DeepSkyBlue #property indicator_color2 Black //---- input parameters extern int Range=3; //---- buffers double Up[]; double Dn[]; double ur1[]; double ur2[]; double h1[]; double l1[]; //----- int cb; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- indicators IndicatorBuffers(6); SetIndexStyle(0,DRAW_ARROW); SetIndexStyle(1,DRAW_ARROW); SetIndexArrow(0,159); SetIndexArrow(1,159); SetIndexBuffer(0,Up); SetIndexBuffer(1,Dn); SetIndexEmptyValue(0,0.0); SetIndexEmptyValue(1,0.0); SetIndexLabel(0,"Up"); SetIndexLabel(1,"Dn"); SetIndexBuffer(2,ur1); SetIndexBuffer(3,ur2); SetIndexBuffer(4,h1); SetIndexBuffer(5,l1); //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { //------ объявление локальных переменных int counted_bars=IndicatorCounted(); int NumBars=1000, n=0, Nbar=0, k=0, hh=0, ll=0, mm=0; double MaH=0.0, MaL=0.0; //----- if(Bars<Range*12-10) return(0); if(counted_bars>=Bars-1) { NumBars=0; } else { NumBars=MathMax(Bars-1-counted_bars-(Range*12-10),Range*12-10); } // for( cb=NumBars; cb>=0; cb--) { Nbar=-1; k=1; mm=0; Dn[cb]=0.0; Up[cb]=0.0; ur1[cb]=0.0; ur2[cb]=0.0; h1[cb]=0.0; l1[cb]=0.0; //----------------------------------------------------------------------------- if( Period()==5 ) //если график - М5 { //Print("Текущая свечка "+cb+" дата "+TimeToStr(Time[cb]) ); //Print("---- Dn[cb]= "+Dn[cb]+" Up[cb]= "+Up[cb] ); if( TimeHour(Time[cb+1])!=TimeHour(Time[cb]) ) { //Print("---- Nbar= "+Nbar+" k= "+k+" mm= "+mm ); n=cb-15; //Print("---- n= "+n ); while( n<=cb+Range*12+5 ) { if( n<0 ) { Nbar=0; n=1; //Print("---- n= "+n+" Nbar= "+Nbar ); } if( TimeHour(Time[n+1])!=TimeHour(Time[n]) ) { if( Nbar==-1 ) { Nbar=n; mm=n; n++; //Print("---- n= "+n+" Nbar= "+Nbar+" mm= "+mm ); continue; } else { h1[k]=High[Highest(NULL,0,MODE_HIGH,(n-Nbar),n)]; l1[k]=Low[Lowest(NULL,0,MODE_LOW,(n-Nbar),n)]; //Print("---- k= "+k+" Nbar= "+Nbar+" n= "+n+" h1["+k+"]= "+h1[k]+" l1["+k+"]= "+l1[k]+" "+(Low[Lowest(NULL,0,MODE_LOW,(n-Nbar),n)])+" "+(High[Lowest(NULL,0,MODE_HIGH,(n-Nbar),n)]) ); k++; Nbar=n; } } n++; } MaH=0; MaL=0; for( n=1;n<=Range;n++) { MaH=MaH+h1[n]; MaL=MaL+l1[n]; } MaH=MaH/Range; MaL=MaL/Range; ur1[cb]=MaH; ur2[cb]=MaL; //Print("---- MaH= "+MaH+" MaL= "+MaL+" ur1["+cb+"]= "+ur1[cb]+" ur2["+cb+"]= "+ur2[cb] ); if( Close[mm+1]>=MaH ) { ll=1; hh=0; //Print("---- Close["+(mm+1)+"]"+Close[mm+1]+">="+"MaH"+MaH+" ="+(Close[mm+1]>=MaH) ); } if( Close[mm+1]<=MaL ) { hh=1; ll=0; //Print("---- Close["+(mm+1)+"]"+Close[mm+1]+"<="+"MaL"+MaL+" ="+(Close[mm+1]<=MaL) ); } //Print("---- ll= "+ll+" hh= "+hh ); } if( ur1[cb]==0.0 ) { ur1[cb]=ur1[cb+1]; ur2[cb]=ur2[cb+1]; //Print("---- ur1["+cb+"]= "+ur1[cb]+" ur2["+cb+"]= "+ur2[cb] ); } if( ll==1 ) { Up[cb]=ur2[cb]; //Print("---- Dn["+cb+"]= "+Dn[cb]+" Up["+cb+"]= "+Up[cb] ); //Print("---- 1 Up["+cb+"]= "+Up[cb]+" ur2[cb]="+ur2[cb] ); } else { if( hh==1 ) { Dn[cb]=ur1[cb]; //Print("---- Dn["+cb+"]= "+Dn[cb]+" Up["+cb+"]= "+Up[cb] ); //Print("---- 2 Up["+cb+"]= "+Up[cb] ); } else { Dn[cb]=Dn[cb+1]; Up[cb]=Up[cb+1]; } } } else { //----------------------------------------------------------------------------- if( Period()==15 ) //если график - М15 { if( TimeHour(Time[cb+1])!=TimeHour(Time[cb]) ) { n=cb-5; while( n<=cb+Range*4+2 ) { if( n<0 ) { Nbar=0; n=1; } if( TimeHour(Time[n+1])!=TimeHour(Time[n]) ) { if( Nbar==-1 ) { Nbar=n; mm=n; n++; continue; } else { h1[k]=High[Highest(NULL,0,MODE_HIGH,(n-Nbar),n)]; l1[k]=Low[Lowest(NULL,0,MODE_LOW,(n-Nbar),n)]; k++; Nbar=n; } } n++; } MaH=0; MaL=0; for( n=1;n<=Range;n++ ) { MaH=MaH+h1[n]; MaL=MaL+l1[n]; } MaH=MaH/Range; MaL=MaL/Range; ur1[cb]=MaH; ur2[cb]=MaL; if( Close[mm+1]>=MaH ) { ll=1; hh=0; } if( Close[mm+1]<=MaL ) { hh=1; ll=0; } } if( ur1[cb]==0.0 ) { ur1[cb]=ur1[cb+1]; ur2[cb]=ur2[cb+1]; } if( ll==1 ) { Up[cb]=ur2[cb]; } else { if( hh==1 ) { Dn[cb]=ur1[cb]; } } } else { //----------------------------------------------------------------------------- if( Period()==30 ) //если график - М30 { if( (TimeMinute(Time[cb])==0 && (TimeHour(Time[cb])==0 || TimeHour(Time[cb])==4 || TimeHour(Time[cb])==8 || TimeHour(Time[cb])==12 || TimeHour(Time[cb])==16 || TimeHour(Time[cb])==20)) ) { n=cb-10; while( n<=cb+Range*8+5 ) { if( n<0 ) { Nbar=0; n=1; } if( (TimeMinute(Time[n])==0 && (TimeHour(Time[n])==0 || TimeHour(Time[n])==4 || TimeHour(Time[n])==8 | TimeHour(Time[n])==12 || TimeHour(Time[n])==16 || TimeHour(Time[n])==20)) ) { if( Nbar==-1 ) { Nbar=n; mm=n; n++; continue; } else { h1[k]=High[Highest(NULL,0,MODE_HIGH,(n-Nbar),n)]; l1[k]=Low[Lowest(NULL,0,MODE_LOW,(n-Nbar),n)]; k++; Nbar=n; } } n++; } MaH=0; MaL=0; for( n=1;n<=Range;n++ ) { MaH=MaH+h1[n]; MaL=MaL+l1[n]; } MaH=MaH/Range; MaL=MaL/Range; ur1[cb]=MaH; ur2[cb]=MaL; if( Close[mm+1]>=MaH ) { ll=1; hh=0; } if( Close[mm+1]<=MaL ) { hh=1; ll=0; } } if( ur1[cb]==0 ) { ur1[cb]=ur1[cb+1]; ur2[cb]=ur2[cb+1]; } if( ll==1 ) { Up[cb]=ur2[cb]; } else { if( hh==1 ) { Dn[cb]=ur1[cb]; } } } else { //----------------------------------------------------------------------------- if( Period()==60 ) //если график - H1 { if( (TimeMinute(Time[cb])==0 && (TimeHour(Time[cb])==0 || TimeHour(Time[cb])==4 || TimeHour(Time[cb])==8 || TimeHour(Time[cb])==12 || TimeHour(Time[cb])==16 || TimeHour(Time[cb])==20)) ) { n=cb-6; while( n<=cb+Range*4+3 ) { if( n<0 ) { Nbar=0; n=1; } if( (TimeMinute(Time[n])==0 && (TimeHour(Time[n])==0 || TimeHour(Time[n])==4 || TimeHour(Time[n])==8 | TimeHour(Time[n])==12 || TimeHour(Time[n])==16 || TimeHour(Time[n])==20)) ) { if( Nbar==-1 ) { Nbar=n; mm=n; n++; continue; } else { h1[k]=High[Highest(NULL,0,MODE_HIGH,(n-Nbar),n)]; l1[k]=Low[Lowest(NULL,0,MODE_LOW,(n-Nbar),n)]; k++; Nbar=n; } } n++; } MaH=0; MaL=0; for( n=1;n<=Range;n++ ) { MaH=MaH+h1[n]; MaL=MaL+l1[n]; } MaH=MaH/Range; MaL=MaL/Range; ur1[cb]=MaH; ur2[cb]=MaL; if( Close[mm+1]>=MaH ) { ll=1; hh=0; } if( Close[mm+1]<=MaL ) { hh=1; ll=0; } } if( ur1[cb]==0 ) { ur1[cb]=ur1[cb+1]; ur2[cb]=ur2[cb+1]; } if( ll==1 ) { Up[cb]=ur2[cb]; } else { if( hh==1 ) { Dn[cb]=ur1[cb]; } } } else { //----------------------------------------------------------------------------- if( Period()==240 ) //если график - H4 { if( TimeDay(Time[cb+1])!=TimeDay(Time[cb]) ) { n=cb-8; while( n<=cb+Range*8+4 ) { if( n<0 ) { Nbar=0; n=1; } if( TimeDay(Time[n+1])!=TimeDay(Time[n]) ) { if( Nbar==-1 ) { Nbar=n; mm=n; n++; continue; } else { h1[k]=High[Highest(NULL,0,MODE_HIGH,(n-Nbar),n)]; l1[k]=Low[Lowest(NULL,0,MODE_LOW,(n-Nbar),n)]; k++; Nbar=n; } } n++; } MaH=0; MaL=0; for( n=1;n<=Range;n++ ) { MaH=MaH+h1[n]; MaL=MaL+l1[n]; } MaH=MaH/Range; MaL=MaL/Range; ur1[cb]=MaH; ur2[cb]=MaL; if( Close[mm+1]>=MaH ) { ll=1; hh=0; } if( Close[mm+1]<=MaL ) { hh=1; ll=0; } } if( ur1[cb]==0 ) { ur1[cb]=ur1[cb+1]; ur2[cb]=ur2[cb+1]; } if( ll==1 ) { Up[cb]=ur2[cb]; } else { if( hh==1 ) { Dn[cb]=ur1[cb]; } } } else { //----------------------------------------------------------------------------- if( Period()==1440 ) //если график - D1 { if( TimeDayOfWeek(Time[cb+1])==5 && TimeDayOfWeek(Time[cb])==1 ) { n=cb-6; while( n<=cb+Range*5+3 ) { if( n<0 ) { Nbar=0; n=1; } if( TimeDayOfWeek(Time[n+1])==6 || TimeDayOfWeek(Time[n])==2 ) { if( Nbar==-1 ) { Nbar=n; mm=n; n++; continue; } else { h1[k]=High[Highest(NULL,0,MODE_HIGH,(n-Nbar),n)]; l1[k]=Low[Lowest(NULL,0,MODE_LOW,(n-Nbar),n)]; k++; Nbar=n; } } n++; } MaH=0; MaL=0; for( n=1;n<=Range;n++ ) { MaH=MaH+h1[n]; MaL=MaL+l1[n]; } MaH=MaH/Range; MaL=MaL/Range; ur1[cb]=MaH; ur2[cb]=MaL; if( Close[mm+1]>=MaH ) { ll=1; hh=0; } if( Close[mm+1]<=MaL ) { hh=1; ll=0; } } if( ur1[cb]==0 ) { ur1[cb]=ur1[cb+1]; ur2[cb]=ur2[cb+1]; } if( ll==1 ) { Up[cb]=ur2[cb]; } else { if( hh==1 ) { Dn[cb]=ur1[cb]; } } } else { //----------------------------------------------------------------------------- if( Period()== 10080 ) //если график - W1 { if( TimeMonth(Time[cb+1])!=TimeMonth(Time[cb]) ) { n=cb-8; while( n<=cb+Range*8+4 ) { if( n<0 ) { Nbar=0; n=1; } if( TimeMonth(Time[n+1])!=TimeMonth(Time[n]) ) { if( Nbar==-1 ) { Nbar=n; mm=n; n++; continue; } else { h1[k]=High[Highest(NULL,0,MODE_HIGH,(n-Nbar),n)]; l1[k]=Low[Lowest(NULL,0,MODE_LOW,(n-Nbar),n)]; k++; Nbar=n; } } n++; } MaH=0; MaL=0; for( n=1;n<=Range;n++ ) { MaH=MaH+h1[n]; MaL=MaL+l1[n]; } MaH=MaH/Range; MaL=MaL/Range; ur1[cb]=MaH; ur2[cb]=MaL; if( Close[mm+1]>=MaH ) { ll=1; hh=0; } if( Close[mm+1]<=MaL ) { hh=1; ll=0; } } if( ur1[cb]==0 ) { ur1[cb]=ur1[cb+1]; ur2[cb]=ur2[cb+1]; } if( ll==1 ) { Up[cb]=ur2[cb]; } else { if( hh==1 ) { Dn[cb]=ur1[cb]; } } } }}}}}} //----------------------------------------------------------------------------- } //----- return(0); } //+------------------------------------------------------------------+