советник Hi_Lo

 
Может кто подскажет, как написать советник. Основанный на индикаторе HI_Lo. Есть инфа, вот только нехватает умения написать советник.
 
В этой статье расписано и расжовано как написать быстро и просто советник.
Если и после прочтения статьи не ясно как слепить эксперта пишите meta-trader2007@yandex.ru, сделаю, но платно!
 
meta-trader2007 писал (а):
В этой статье расписано и расжовано как написать быстро и просто советник.
vKharlamenko, посмотри также и комменты к этой статье. Они не самые благоприятные.
 
Mathemat:
meta-trader2007 писал (а):
В этой статье расписано и расжовано как написать быстро и просто советник.


vKharlamenko, посмотри также и комменты к этой статье. Они не самые благоприятные.


А толку от комментов? Нужно советник слепить, а не комменты "профессионалов" МQL читать.(Те кто коментировал критикуя статью боятся что все те кому нужны советники буду делать их сами по шаблону, а желая большего обучатся программированию на МКЛ и не станут заказывать платные советники). Хотя автору следовало бы более подробно рассмотреть код шаблона, разъяснив каждую строчку.
Есть шаблон и всё более менее расписано. Конечно для того кто не видел код на MQL тому это не поможет.
Но этого шаблона достаточно чтобы создать советник. Вставить условия продажи/покупки и готово.
 

короче.

У меня есть вот, такой индикатор ZigZag

//+------------------------------------------------------------------+
//| Zigzag. mq4 |
//| Copyright © 2005-2007, MetaQuotes Software Corp. |
//| https://www.metaquotes.net// |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, MetaQuotes Software Corp."
#property link "https://www.metaquotes.net//"

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Red
//---- indicator parameters
extern int ExtDepth=12;
extern int ExtDeviation=5;
extern int ExtBackstep=3;
//---- indicator buffers
double ZigzagBuffer[];
double HighMapBuffer[];
double LowMapBuffer[];
int level=3; // recounting's depth
bool downloadhistory=false;

//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
IndicatorBuffers(3);
//---- drawing settings
SetIndexStyle(0,DRAW_SECTION);
//---- indicator buffers mapping
SetIndexBuffer(0,ZigzagBuffer);
SetIndexBuffer(1,HighMapBuffer);
SetIndexBuffer(2,LowMapBuffer);
SetIndexEmptyValue(0,0.0);

//---- indicator short name
IndicatorShortName("ZigZag("+ExtDepth+","+ExtDeviation+", "+ExtBackstep+")");
//---- initialization done
return(0);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
{

int i, counted_bars = IndicatorCounted();

int limit,counterZ,whatlookfor;
int shift,back,lasthighpos,lastlowpos;
double val,res;
double curlow,curhigh,lasthigh,lastlow;

if (counted_bars==0 && downloadhistory) // history was downloaded
{
ArrayInitialize(ZigzagBuffer,0.0);
// Print ("Обнуляем буфер индюка");
ArrayInitialize(HighMapBuffer,0.0);
// Print ("Обнуляем буфер Высот");
ArrayInitialize(LowMapBuffer,0.0);
// Print ("Обнуляем буфер Низин");
}
if (counted_bars==0)
{
limit=Bars-ExtDepth;
// Print ("Устанавливаем величину лимита limit=Bars-ExtDepth"+limit);
downloadhistory=true;
}
if (counted_bars>0)
{
while (counterZ<3 && i<100)
{
res=ZigzagBuffer[i];
if (res!=0) counterZ++;
i++;
}
i--;
limit=i;
if (LowMapBuffer[i]!=0)
{
curlow=LowMapBuffer[i];
whatlookfor=1;
}
else
{
curhigh=HighMapBuffer[i];
whatlookfor=-1;
}
for (i=limit-1;i>=0;i--)
{
ZigzagBuffer[i]=0.0;
LowMapBuffer[i]=0.0;
HighMapBuffer[i]=0.0;
}
}

for(shift=limit; shift>=0; shift--)
{
val=Low[iLowest(NULL,0,MODE_LOW,ExtDepth,shift)];
// Print(" Минимальная цена элемента массива-таймсерии"+val);
if(val==lastlow) val=0.0;
else
{
lastlow=val;
if((Low[shift]-val)>(ExtDeviation*Point)) val=0. 0;
else
{
for(back=1; back<=ExtBackstep; back++)
{
res=LowMapBuffer[shift+back];
if((res!=0)&&(res>val)) LowMapBuffer[shift+back]=0. 0;
}
}
}
LowMapBuffer[shift]=val;

//--- high
val=High[iHighest(NULL,0,MODE_HIGH,ExtDepth,shift)];
if(val==lasthigh) val=0.0;
else
{
lasthigh=val;
if((val-High[shift])>(ExtDeviation*Point)) val=0. 0;
else
{
for(back=1; back<=ExtBackstep; back++)
{
res=HighMapBuffer[shift+back];
if((res!=0)&&(res<val)) HighMapBuffer[shift+back]=0. 0;
}
}
}
HighMapBuffer[shift]=val;
}

// final cutting
if (whatlookfor==0)
{
lastlow=0;
lasthigh=0;
}
else
{
lastlow=curlow;
lasthigh=curhigh;
}
for (shift=limit;shift>=0;shift--)
{
res=0.0;
switch(whatlookfor)
{
case 0: // look for peak or lawn
if (lastlow==0 && lasthigh==0)
{
if (HighMapBuffer[shift]!=0)
{
lasthigh=High[shift];
lasthighpos=shift;
whatlookfor=-1;
ZigzagBuffer[shift]=lasthigh;
res=1;
}
if (LowMapBuffer[shift]!=0)
{
lastlow=Low[shift];
lastlowpos=shift;
whatlookfor=1;
ZigzagBuffer[shift]=lastlow;
res=1;
}
}
break;
case 1: // look for peak
if (LowMapBuffer[shift]!=0. 0 && LowMapBuffer[shift]<lastlow && HighMapBuffer[shift]==0. 0)
{
ZigzagBuffer[lastlowpos]=0. 0;
lastlowpos=shift;
lastlow=LowMapBuffer[shift];
ZigzagBuffer[shift]=lastlow;
// Print("Установка впадины с индексом "+shift+" = "+lastlow);
res=1;
}
if (HighMapBuffer[shift]!=0. 0 && LowMapBuffer[shift]==0. 0)
{
lasthigh=HighMapBuffer[shift];
lasthighpos=shift;
ZigzagBuffer[shift]=lasthigh;
// Print("Установка вершины с индексом "+shift+" = "+lasthigh);
whatlookfor=-1;
res=1;
}
break;
case -1: // look for lawn
if (HighMapBuffer[shift]!=0. 0 && HighMapBuffer[shift]>lasthigh && LowMapBuffer[shift]==0. 0)
{
ZigzagBuffer[lasthighpos]=0. 0;
lasthighpos=shift;
lasthigh=HighMapBuffer[shift];
ZigzagBuffer[shift]=lasthigh;
//Print("Установка вершины с индексом "+shift+" = "+lasthigh);
}
if (LowMapBuffer[shift]!=0. 0 && HighMapBuffer[shift]==0. 0)
{
lastlow=LowMapBuffer[shift];
lastlowpos=shift;
ZigzagBuffer[shift]=lastlow;
// Print("Установка впадины с индексом "+shift+" = "+lastlow);
whatlookfor=1;
}
break;
default: return;
}
}

return(0);
}
//+------------------------------------------------------------------+

еще есть вот такой индикатор Hi_Lo

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 DeepSkyBlue
#property indicator_color2 Snow

//---- input parameters
extern int Range=3;
extern int NextTF=240;
extern bool UseFullTF=1;
//---- buffers
double Up[];
double Dn[];
double UpMA[];
double DnMA[];

int init_flag,d_b=0,no_dr_b;

//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
string short_name;
//---- indicators
IndicatorBuffers(4);
SetIndexStyle(0,DRAW_LINE,0,2);
SetIndexStyle(1,DRAW_LINE,0,2);
//SetIndexStyle(2,DRAW_LINE,0,2);
//SetIndexStyle(3,DRAW_LINE,0,2);
SetIndexBuffer(0,Up);
SetIndexBuffer(1,Dn);
SetIndexBuffer(2,UpMA);
SetIndexBuffer(3,DnMA);
SetIndexLabel(0,"Up");
SetIndexLabel(1,"Dn");
SetIndexEmptyValue(0,0.0);
SetIndexEmptyValue(1,0.0);
SetIndexEmptyValue(2,0.0);
SetIndexEmptyValue(3,0.0);
//----
short_name="HiLo_Act_Next_Profi2 ("+Range+",M"+NextTF+")";
IndicatorShortName(short_name);
init_flag=0;
//----
return(0);
}
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int counted_bars=IndicatorCounted(),limit,cb,i,j,bb_count,cb_count,sb_count,b_bar, end_bar,end_sbar;
datetime TimeArray[],TimeArray_c[],end_time,begin_time;
//----
if( init_flag!=1 )
{
if( minit() < 0 )
{
return(-1);
}
}
if( counted_bars<0 )
{
return(-1);
}
else
{
if( Bars-1-counted_bars < 0 )
{
limit=0;
}
else
{
if( Bars-1-counted_bars > Bars-1-no_dr_b)
{
limit=Bars-1-no_dr_b;
}
else
{
limit=Bars-1-counted_bars;
}
}
}
bb_count=ArrayCopySeries(TimeArray,MODE_TIME,Symbol(),NextTF);
cb_count=ArrayCopySeries(TimeArray_c,MODE_TIME,Symbol(),Period());
if( bb_count<=0 || cb_count<=0 )
{
return(0);
}
for(cb=limit;cb>=0;cb--)
{
if( MathCeil(TimeArray[ArrayBsearch( TimeArray,Time[cb],0,0,MODE_ASCEND)]/NextTF/60)*NextTF*60 >
MathCeil(Time[cb]/Period()/60)*Period()*60)
{
b_bar =ArrayBsearch( TimeArray,Time[cb],0,0,MODE_ASCEND)+1+Range;
end_bar =ArrayBsearch( TimeArray,Time[cb],0,0,MODE_ASCEND)+2;
//end_time=(MathCeil(TimeArray[ArrayBsearch( TimeArray,Time[cb],0,0,MODE_ASCEND)+1]/NextTF/60))*NextTF*60;
//begin_time=(MathCeil(TimeArray[ArrayBsearch( TimeArray,Time[cb],0,0,MODE_ASCEND)+1+Range]/NextTF/60))*NextTF*60;
}
else
{

b_bar =ArrayBsearch( TimeArray,Time[cb],0,0,MODE_ASCEND)+Range;
end_bar =ArrayBsearch( TimeArray,Time[cb],0,0,MODE_ASCEND)+1;
//end_time=MathCeil(TimeArray[ArrayBsearch( TimeArray,Time[cb],0,0,MODE_ASCEND)]/NextTF/60)*NextTF*60;
//begin_time=(MathCeil(TimeArray[ArrayBsearch( TimeArray,Time[cb],0,0,MODE_ASCEND)+Range]/NextTF/60))*NextTF*60;
}
//Alert( TimeToStr(Time[cb])+" ", TimeToStr(iTime(NULL,NextTF,b_bar))+" ", TimeToStr(iTime(NULL, NextTF,end_bar)) );
//b_bar=ArrayBsearch( TimeArray_c,begin_time,0,0,MODE_ASCEND);
//end_sbar=ArrayBsearch( TimeArray_c,end_time,0,0,MODE_ASCEND)+1;
UpMA[cb]=iMA(Symbol(),NextTF,Range,0,MODE_SMA,PRICE_HIGH,end_bar);
DnMA[cb]=iMA(Symbol(),NextTF,Range,0,MODE_SMA,PRICE_LOW,end_bar);
//UpMA[cb]=iMA(Symbol(),Period(),b_bar+1-end_bar,0,MODE_SMA,PRICE_HIGH,end_bar);
//DnMA[cb]=iMA(Symbol(),Period(),b_bar+1-end_bar,0,MODE_SMA,PRICE_LOW,end_bar);
if( UseFullTF==0 )
{
if( Close[cb]>UpMA[cb] )
{
Dn[cb]=DnMA[cb];
Up[cb]=0.0;
}
else
{
if( Close[cb]<DnMA[cb] )
{
Up[cb]=UpMA[cb];
Dn[cb]=0.0;
}
else
{
if( Up[cb+1]>0 )
{
Up[cb]=UpMA[cb];
Dn[cb]=0.0;
}
if( Dn[cb+1]>0 )
{
Dn[cb]=DnMA[cb];
Up[cb]=0.0;
}
}
}
}
else
{
Print(TimeToStr(Time[cb])+" "+TimeToStr((MathCeil(TimeArray[end_bar]/NextTF/60)+1)*NextTF*60)+" "+TimeToStr((MathCeil(Time[cb]/Period()/60))*Period()*60));
if( Close[cb+1]>UpMA[cb+1] &&
(MathCeil(TimeArray[end_bar]/NextTF/60)+1)*NextTF*60==(MathCeil(Time[cb]/Period()/60))*Period()*60 )
{
Dn[cb]=DnMA[cb];
Up[cb]=0.0;
}
else
{
if( Close[cb+1]<DnMA[cb+1] &&
(MathCeil(TimeArray[end_bar]/NextTF/60)+1)*NextTF*60==(MathCeil(Time[cb]/Period()/60))*Period()*60 )
{
Up[cb]=UpMA[cb];
Dn[cb]=0.0;
}
else
{
if( Up[cb+1]>0 )
{
Up[cb]=UpMA[cb];
Dn[cb]=0.0;
}
if( Dn[cb+1]>0 )
{
Dn[cb]=DnMA[cb];
Up[cb]=0.0;
}
}
}
}
}
//----
return(0);
}
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Определение начальной точки отрисовки |
//+------------------------------------------------------------------+
int minit()
{
datetime TimeArray[];
int bb_count,cb,i;
//----
//получение времени начала каждого бара с другого таймфрейма
bb_count=ArrayCopySeries(TimeArray,MODE_TIME,Symbol(),NextTF);
if( bb_count<1 )
{
Alert("Отсутствуют данные Next таймфрейма!");
return(-1);
}
//проверка на необходимость обновления данных большего т-ф
if( MathCeil(TimeArray[0]/NextTF/60)*NextTF*60 < MathCeil(Time[0]/Period()/60)*Period()*60-NextTF*60 )
{
Alert("Необходимо обновить данные Next таймфрейма!");
return(-1);
}
//проверка на необходимость обновления данных текущего т-ф
if( MathCeil(TimeArray[0]/NextTF/60)*NextTF*60 > MathCeil(Time[0]/Period()/60)*Period()*60 )
{
Alert("Необходимо обновить данные текущего таймфрейма!");
//return(-1);
}
//если бары на текущем т-ф начинаются с момента отрисовки баров большего т-ф или позже
if( MathCeil(Time[Bars-1]/Period()/60)*Period()*60 >= MathCeil(TimeArray[bb_count-1]/NextTF/60)*NextTF*60 )
{
for( cb=bb_count-1;cb>=0;cb--)
{
if( MathCeil(Time[Bars-1]/Period()/60)*Period()*60 >= MathCeil(TimeArray[cb]/NextTF/60)*NextTF*60 &&
MathCeil(Time[Bars-1]/Period()/60)*Period()*60 < MathCeil(TimeArray[cb-1]/NextTF/60)*NextTF*60 )
{
for( i=Bars-1;i>=0;i-- )
{
if( MathCeil(Time[i]/Period()/60)*Period()*60 >= MathCeil(TimeArray[cb-Range]/NextTF/60)*NextTF*60 )
{
d_b=i;
no_dr_b=Bars-1-d_b;
SetIndexDrawBegin(0,no_dr_b+1);
SetIndexDrawBegin(1,no_dr_b+1);
init_flag=1;
break;
}
}
if( d_b>0 )
{
break;
}
}
}
}
else
{
for(cb=Bars-1;cb>=0;cb--)
{
//если время бара больше или равно времени бара с которого начинаем отрисовку...
if( MathCeil(Time[cb]/Period()/60)*Period()*60 >= MathCeil(TimeArray[bb_count-1-Range]/NextTF/60)*NextTF*60 )
{
d_b=cb;
no_dr_b=Bars-1-d_b;
SetIndexDrawBegin(0,no_dr_b+1);
SetIndexDrawBegin(1,no_dr_b+1);
init_flag=1;
break;
}
}
}
if( d_b<1 )
{
return(-1);
}
//----
return(0);
}
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Custor indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+

в прикрепленном файле, описывается сама торговая система.

Как на основе всего что есть, написать советник и тропестировать его?

 
Зиг-заг - врущий индюк - он не предсказывает ничего, он только хорошо показывает пики и впадины на истории.
Но посмотрим что за ТС...
 
Mathemat:
meta-trader2007 писал (а):
В этой статье расписано и расжовано как написать быстро и просто советник.


vKharlamenko, посмотри также и комменты к этой статье. Они не самые благоприятные.


)))))))
Метакуотчики потрудились: они хотели мне помочь - 2 вариант статей писалось! :) Они свой выложили!
Пиши мне - помогу! Коодинаты в профиле!
 
meta-trader2007 писал (а):
Зиг-заг - врущий индюк - он не предсказывает ничего, он только хорошо показывает пики и впадины на истории.
Но посмотрим что за ТС...



Его можно использовать на откатах после 2-х свечей в обратном направлении от вершины. Но одного его мало ;)
 
Стоп!!! а где "файл прикреплённый"?
 
cloud666:
meta-trader2007 писал (а):
Зиг-заг - врущий индюк - он не предсказывает ничего, он только хорошо показывает пики и впадины на истории.
Но посмотрим что за ТС...



Его можно использовать на откатах после 2-х свечей в обратном направлении от вершины. Но одного его мало ;)


Да нужен осцил для закрытия позы.
 

вот ссылка для скачивания Kharlamenko.narod.ru\13st.pdf

Причина обращения: