Трендовая по Сперандео

 

Здравствуйте!

Написал индикатор, который рисует трендовые по системе Сперандео. Загвоздка в том, что он рисует несколько трендовых, а потом перестает рисовать... или пропускает вершины без видимой причины...

Крутил код и так и так - посоветуйте, плиз, как сделать чтобы он рисовал неограниченное количество трендовых.

//+------------------------------------------------------------------+
//| ZZ Dinapoli trend 2.mq4 |
//+------------------------------------------------------------------+
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Green
#property indicator_width1 2
//---- input parameters
extern int barn=500;
extern int Length=6;
extern color color_trend_A = LightGreen;
extern bool ray=true;
extern bool AlertsOn = false;
//---- buffers
double ExtMapBuffer1[];
double priceT[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicators
SetIndexEmptyValue(0,0.0);
//SetIndexDrawBegin(0, barn);
SetIndexStyle(0,DRAW_SECTION);
SetIndexBuffer(0,ExtMapBuffer1);
SetIndexBuffer(0, priceT);
return(0);
}
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int counted_bars=IndicatorCounted();
int shift,Swing,Swing_n,uzl,i,zu,zd,mv;
double LL,HH,BH,BL,NH,NL;
double Uzel[10000][3];
string text;
// loop from first bar to current bar (with shift=0)
Swing_n=0;Swing=0;uzl=0;
BH =High[barn];BL=Low[barn];zu=barn;zd=barn;

for (shift=barn;shift>=0;shift--) {
LL=10000000;HH=-100000000;
for (i=shift+Length;i>=shift+1;i--) {
if (Low[i]< LL) {LL=Low[i];}
if (High[i]>HH) {HH=High[i];}
}


if (Low[shift]<LL && High[shift]>HH){
Swing=2;
if (Swing_n==1) {zu=shift+1;}
if (Swing_n==-1) {zd=shift+1;}
} else {
if (Low[shift]<LL) {Swing=-1;}
if (High[shift]>HH) {Swing=1;}
}

if (Swing!=Swing_n && Swing_n!=0) {
if (Swing==2) {
Swing=-Swing_n;BH = High[shift];BL = Low[shift];
}
uzl=uzl+1;
if (Swing==1) {
Uzel[uzl][1]=zd;
Uzel[uzl][2]=BL;
}
if (Swing==-1) {
Uzel[uzl][1]=zu;
Uzel[uzl][2]=BH;
}
BH = High[shift];
BL = Low[shift];
}

if (Swing==1) {
if (High[shift]>=BH) {BH=High[shift];zu=shift;}}
if (Swing==-1) {
if (Low[shift]<=BL) {BL=Low[shift]; zd=shift;}}
Swing_n=Swing;
}
for (i=1;i<=uzl;i++) {
//text=DoubleToStr(Uzel[i][1],0);
//text=;
mv=StrToInteger(DoubleToStr(Uzel[i][1],0));
ExtMapBuffer1[mv]=Uzel[i][2];
}

double uroven1=High[1];
double uroven2=Low[1];
double price0=GetExtremumZZPrice("",0,0);
int bar0=GetExtremumZZBar("",0,0);
double price1=GetExtremumZZPrice("",0,1);
int bar1=GetExtremumZZBar("",0,1);
double price2=GetExtremumZZPrice("",0,2);
int bar2=GetExtremumZZBar("",0,2);
if (
((price0>price2)&&(price1<uroven1)&&(price0<price1))||
((price0<price2)&&(price1>uroven2)&&(price0>price1))
)
{
ObjectCreate("trend_A"+i,OBJ_TREND,0,iTime(NULL,0,bar2),price2,iTime(NULL,0,bar0),price0);
ObjectSet("trend_A"+i,OBJPROP_STYLE,STYLE_SOLID);
ObjectSet("trend_A"+i,OBJPROP_WIDTH,2);
ObjectSet("trend_A"+i,OBJPROP_COLOR,color_trend_A);
ObjectSet("trend_A"+i, OBJPROP_RAY, ray);
}

//static datetime lt=0;

//for (i=1;i<100;i++)
//{ if(ExtMapBuffer1[i]!=0)
//{ if(lt!=Time[i])
//{
//for (int k=0; k<200; k++)
//{
double priceT=ObjectGetValueByShift("trend_A"+i, 1);
double b=Close[1];
double c=Low[1];
double d=High[1];
if ((c<priceT)&&(b>priceT)&&(AlertsOn==true))
{
Alert("Пересечение трендовой вверх... Do something:)");
return;
}
if ((d>priceT)&&(b<priceT)&&(AlertsOn==true))
{
Alert("Пересечение трендовой вниз... Do something:)");
return;
}
//}
//}
//}
//lt=Time[i];
//}

return(0);
}
//+------------------------------------------------------------------+
//+----------------------------------------------------------------------------+
//| Возвращает экстремум ЗигЗага по его номеру. |
//| Параметры: |
//| sym - наименование инструмента ("" - текущий символ) |
//| tf - таймфрейм ( 0 - текущий ТФ) |
//| ne - номер экстремума ( 0 - текущий) |
//| dp - ExtDepth |
//| dv - ExtDeviation |
//| bc - ExtBackstep |
//+----------------------------------------------------------------------------+
double GetExtremumZZPrice(string sym="", int tf=0, int ne=0, int barn=500, int Length=6) {
if (sym=="") sym=Symbol();
double zz;
int i, k=iBars(sym, tf), ke=0;

for (i=1; i<k; i++) {
zz=iCustom(sym, tf, "Dinap_tar._zig_zag", barn, Length, 0, i);
if (zz!=0) {
ke++;
if (ke>ne) return(zz);
}
}
Print("GetExtremumZZPrice(): Экстремум ЗигЗага номер ",ne," не найден");
return(0);
}

//+----------------------------------------------------------------------------+
//| Возвращает номер бара экстремума ЗигЗага по его номеру. |
//| Параметры: |
//| sym - наименование инструмента ("" - текущий символ) |
//| tf - таймфрейм ( 0 - текущий ТФ) |
//| ne - номер экстремума ( 0 - текущий) |
//| dp - ExtDepth |
//| dv - ExtDeviation |
//| bc - ExtBackstep |
//+----------------------------------------------------------------------------+
int GetExtremumZZBar(string sym="", int tf=0, int ne=0, int barn=500, int Length=6) {
if (sym=="") sym=Symbol();
double zz;
int i, k=iBars(sym, tf), ke=0;

for (i=1; i<k; i++) {
zz=iCustom(sym, tf, "Dinap_tar._zig_zag", barn, Length, 0, i);
if (zz!=0) {
ke++;
if (ke>ne) return(i);
}
}
Print("GetExtremumZZBar(): Экстремум ЗигЗага номер ",ne," не найден");
return(0);
}


Файлы:
 
v2812:

Здравствуйте!

Написал индикатор, который рисует трендовые по системе Сперандео. Загвоздка в том, что он рисует несколько трендовых, а потом перестает рисовать... или пропускает вершины без видимой причины...

Крутил код и так и так - посоветуйте, плиз, как сделать чтобы он рисовал неограниченное количество трендовых.

Это невозможно. В справке чётко сказано что индикторных буферов может быть не более 8
 
drknn:
Это невозможно. В справке чётко сказано что индикторных буферов может быть не более 8
:))) в индюке объектами строится :))
 
sergeev:
:))) в индюке объектами строится :))

ну не бесконечное число же :)
 

Мне объектами и надо... А на счет буферов не понял - у меня же далеко не 8...

Я в программировании новичек - так что подскажите, что не так с кодом?

 
v2812:

Мне объектами и надо... А на счет буферов не понял - у меня же далеко не 8...

Я в программировании новичек - так что подскажите, что не так с кодом?

вставляйте Print или Comment в интересующие места и разбирайтесь.
 

индикатор рисует, зачем комент?

 
v2812:

индикатор рисует, зачем комент?

у вас проблемы с индюком есть?
 
У Вас прописаны 2 буфера. На проинициализирован только 1.
 
drknn:
У Вас прописаны 2 буфера. На проинициализирован только 1.

исправил... все равно пропускает вершины.
sergeev:
у вас проблемы с индюком есть?

проблемы есть. поэтому и спрашиваю у более опытных товарисчей
 

чего зря клаву топтать. лучше чем вы в этом индюке не разбирается никто.

используйте Comment или Print для вывода промежуточных данных.

Это самый быстрый и простой способ отлова.

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