Люди добрые помогите новичку ))

 

Три строчки текста, но в чем засада не пойму.

Задача: выделить бары в которых |O-C|>=2/3*(H-L), т.е. те, в которых есть относительно существенное движение цены.

Проблема в том, что индикатор выделяет такие бары "один через два", и я не вижу причину этого.

Может кто поможет, заранее спасибо.

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Red

//---- buffers
double telo,teni,ExtUp[];

int init()
{
//---- indicator buffers mapping
SetIndexBuffer(0,ExtUp);
//---- drawing settings
SetIndexStyle(0,DRAW_ARROW);
SetIndexArrow(0,119);
//----
SetIndexEmptyValue(0,0.0);
//---- initialization done
return(0);
}
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//---- TODO: add your code here

//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int i,nCountedBars;
nCountedBars=IndicatorCounted();
//---- last counted bar will be recounted
if(nCountedBars<=2)
i=Bars-nCountedBars-3;
if(nCountedBars>2)
{
nCountedBars--;
i=Bars-nCountedBars-1;
}
//----Up and Down Fractals
while(i>=2)
{
teni=(High[i]/Point)-(Low[i]/Point);
telo=MathAbs((Open[i]/Point)-(Close[i]/Point));
if(telo>=teni*2/3 && teni>=6)
{
ExtUp[i]=High[i]+3*Point;
}
i--;
}
//----
return(0);
}

Файлы:
myf.mq4  2 kb
 

а к чему эти пляски?

if(nCountedBars<=2) i=Bars-nCountedBars-3;

if(nCountedBars>2)

while(i>=2)

 
sergeev:

а к чему эти пляски?

if(nCountedBars<=2) i=Bars-nCountedBars-3;

if(nCountedBars>2)

while(i>=2)


а ну это из предыдущего моего произведения )))

в любом случае сути это не меняет

 
меняет. сделайте нормальную проверку и расчет до 0.
 

А смысл в |O-C|>=2/3*(H-L) в части (H-L) в чём интересно? Ну так - логика интересна?

К примеру открылись по 1,0(О), закрылись по 1,0(С), максимум был 3,0(Н), минимум 1,5(L). И что?

По движению лучше тики как то учесть или |O-C|>= только использовать за какой нибудь период:

(iOpen(Symbol(),Period(),0)+iOpen(Symbol(),Period(),1))/2-(iClose(Symbol(),Period(),0)+iClose(Symbol(),Period(),1))/2
 
new-rena:

А смысл в |O-C|>=2/3*(H-L) в части (H-L) в чём интересно? Ну так - логика интересна?

К примеру открылись по 1,0(О), закрылись по 1,0(С), максимум был 3,0(Н), минимум 1,5(L). И что?

По движению лучше тики как то учесть или |O-C|>= только использовать за какой нибудь период:



не понял вопроса

как это открылись по 1,0, а минимум 1,5 - используются цены одного бара

про тики тоже не внял ))

 
sergeev:
меняет. сделайте нормальную проверку и расчет до 0.


переделал

картина не изменилась

int start()
{
int i,nCountedBars,limit;
int counted_bars=IndicatorCounted();
if(counted_bars>0) counted_bars--;
limit=Bars-counted_bars;

for(i=0; i<limit; i++)
{
teni=(High[i]/Point)-(Low[i]/Point);
telo=MathAbs((Open[i]/Point)-(Close[i]/Point));
if(telo>=teni*2/3 && teni>=6)
{
ExtUp[i]=High[i]+3*Point;
}
}
//----
return(0);
}

 
сделайте teni и telo буферами и посмотрите на их значения по Ctrl+D
 
sergeev:
сделайте teni и telo буферами и посмотрите на их значения по Ctrl+D

корректные
 

Малость поправил

Файлы:
myf_1.mq4  2 kb
 
Vinin:

Малость поправил


Рисует один в один с первоначальным вариантом. Определяет не все бары, удовлетворяющие условию. Это легко можно увидеть на таймфрейме М5, там цифры небольшие - удобно считать.

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