вопрос по советнику

 

не могу понять почему неправильно работает советник

должен открывать и закрывать позиции по пересечению Di+ и Di-

b4plusdi=iADX(NULL,0,14,PRICE_CLOSE,MODE_PLUSDI,1);
nowplusdi=iADX(NULL,0,14,PRICE_CLOSE,MODE_PLUSDI,0);
b4minusdi=iADX(NULL,0,14,PRICE_CLOSE,MODE_MINUSDI,1);
nowminusdi=iADX(NULL,0,14,PRICE_CLOSE,MODE_MINUSDI,0);

if (b4plusdi<b4minusdi && nowplusdi>nowminusdi)
{
Opn_B=true; // Критерий откр. Buy
Cls_S=true; // Критерий закр. Sell
}
if (b4plusdi>b4minusdi && nowplusdi<nowminusdi)
{
Opn_S=true; // Критерий откр. Sell
Cls_B=true; // Критерий закр. Buy
}



полный код советника в приложении

Файлы:
 
jackdead писал(а) >>

не могу понять почему неправильно работает советник

должен открывать и закрывать позиции по пересечению Di+ и Di-

Ну наверно, потому что Вы смотрите пересечение на 0 баре, на нем сигнал может многократно измениться.

 
b4plusdi=iADX(NULL,0,14,PRICE_CLOSE,MODE_PLUSDI,2);
nowplusdi=iADX(NULL,0,14,PRICE_CLOSE,MODE_PLUSDI,1);
b4minusdi=iADX(NULL,0,14,PRICE_CLOSE,MODE_MINUSDI,2);

nowminusdi=iADX(NULL,0,14,PRICE_CLOSE,MODE_MINUSDI,1);

предлагаете так ?



на самом деле пытался сделать советника по алгоритму adx crossing

и че-то не получается

Файлы:
 

Ну для проверки идеи можно непоредственно использовать вызов этого индикатора из советника, так не пробовали?

 

для этого надо переписывать индикатор чтобы он возвращал значения или есть другой метод ?

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



int start()
{
if (CountBars>=Bars) CountBars=Bars;
SetIndexDrawBegin(0,Bars-CountBars);
SetIndexDrawBegin(1,Bars-CountBars);
int i,shift,counted_bars=IndicatorCounted();
if(counted_bars<0) return(-1);
if(counted_bars<1)
{
for(i=1;i<=CountBars;i++) val1[CountBars-i]=0.0;
for(i=1;i<=CountBars;i++) val2[CountBars-i]=0.0;
}

for (shift = CountBars; shift>=0; shift--)
{
b4plusdi=iADX(NULL,0,ADXbars,PRICE_CLOSE,MODE_PLUSDI,shift-1);
nowplusdi=iADX(NULL,0,ADXbars,PRICE_CLOSE,MODE_PLUSDI,shift);
b4minusdi=iADX(NULL,0,ADXbars,PRICE_CLOSE,MODE_MINUSDI,shift-1);
nowminusdi=iADX(NULL,0,ADXbars,PRICE_CLOSE,MODE_MINUSDI,shift);
if (b4plusdi>b4minusdi && nowplusdi<nowminusdi)
{
val1[shift]=Low[shift]-5*Point;

// вот тут возвращать значение на убывающий тренд ?

}
if (b4plusdi<b4minusdi && nowplusdi>nowminusdi)
{
val2[shift]=High[shift]+5*Point;

// вот тут возвращать значение на возрастающий тренд ?

}
}
return(0);
}

 
jackdead писал(а) >>

для этого надо переписывать индикатор чтобы он возвращал значения или есть другой метод ?

Переписывать? Вы смеетесь? Это же 21 век, МТ4)

if (iCustom(Symbol(),0,"ADXvCrossing",0,2)!=2147483647) //это условие для BUY

{

.....

}

if (iCustom(Symbol(),0,"ADXvCrossing",1,2)!=2147483647) // это условие для SELL

{

....

}
Индикатор рисует стрелки только на 2 -м баре потому на истории смотрится неплохо, хотя и на первом проскакивает пару раз, видать кривавато написан.
 

спасибо

буду разбираться

 

а что за число 2147483647 ?

 

Типа EMPTY_VALUE

https://www.mql5.com/ru/search

 

жесть

я наверно дико туплю

но вот у нас есть два буффера у индикатора adx crossing и две внешних переменных

значит значение индикатора будет вычисляться так

iCustom(Symbol(),0,"ADX Crossing",14,350,0,2)
iCustom(Symbol(),0,"ADX Crossing",14,350,1,2)

?

 
Да, это значения стрелок индикатора на втором баре. Вместо конкретных значений можно использовать переменные.
Причина обращения: