Индексация свечек в Mql идет справа налево.

 

Переписал на Mql индикатор Корсинского NTRT WATR

//+------------------------------------------------------------------+
//| $NTRT_WATR. mq4 |
//| Alex |
//| al53yandex. ru |
//+------------------------------------------------------------------+
#property copyright "Alex"
#property link "al53yandex.ru"

//#property indicator_separate_window
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Red
//---- input parameters
extern int Len=14;
extern double M=0.003;
//---- buffers
double ExtMapBuffer1[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicators
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,ExtMapBuffer1);
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int counted_bars=IndicatorCounted(), limit;
// Индикатор тренда NTRT WATR описанный корсинским
double Trend, Hprice,LPrice,Reverse,TrueHi,TrueLo,TrueRng,WATR;
if(counted_bars > 0) counted_bars--;
limit = Bars - counted_bars;
for (int i=Bars ;i >=0;i--)
{
if(Bars-i<2) continue;
if (Bars-i<Len+1)
{
if (Close[i]>High[i+1]) TrueHi=Close[i];
else TrueHi=High[i+1];
if (Close[i]<Low[i+1]) TrueLo=Close[i];
else TrueLo=Low[i+1];
TrueRng = TrueHi - TrueLo;
continue ;
}
TrueRng=iATR(NULL,0,Len,i);
WATR=iMA(NULL,0,Len,0,MODE_SMA,TrueRng, i);
if (Trend>=0 )
{
if (Close[i]>Hprice) Hprice=Close[i];
Reverse=Hprice-M*WATR;
if (Close[i]<Reverse)
{
Trend=-1;
LPrice=Close[i];
Reverse=LPrice+M*WATR;
}
}
if (Trend<=0)
{
if(Close[i]<LPrice) LPrice=Close[i];
Reverse=LPrice+M*WATR;
if(Close[i]>=Reverse)
{
Trend=1;
Hprice=Close[i];
Reverse=Hprice-M*WATR;
}
}

ExtMapBuffer1[i]=Reverse;
// if (Symbol()=="EURUSD") Alert("limit= ",limit);
}

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

Смешная проблемка . Если в инициализации цикла ставить for (int i=Bars ;i >=0;i--) все работает чики пуки .Если for (int i=limit ;i >=0;i--), то фигня какя то .В чем проблема понять не могу .Просьба натыкать фейсом с подробностями .И еще индексация свечек в Mql идет справа налево, те последняя (правая) пришедшая свеча имеет индекс 0, а крайняя левая на графике индекс Bars ?

 

Привет.

if(counted_bars > 0) counted_bars--;

Вот эта строчка лишняя.

Прикрепил ещё одну версию индикатора, возможно Вам будет интересно взглянуть.

Файлы:
watr.mq4  6 kb
 
Dm_35:

Привет.

if(counted_bars > 0) counted_bars--;

Вот эта строчка лишняя.

Прикрепил ещё одну версию индикатора, возможно Вам будет интересно взглянуть.


Странно тоже как то коряво работает .за вашу версию спасибо .

 

Попробуйте в init вставить

int init()
{
//---- indicators
  SetIndexStyle(0,DRAW_LINE);
  SetIndexBuffer(0,ExtMapBuffer1);
//----
  ArraySetAsSeries(ExtMapBuffer1,true); // Переворачивает индексы индикаторного массива
//----
  return(0);
}
 
бара с номером Bars не существует. последний бар - Bars-1