It doesn't recalculate 0 bar for the same reason you don't start with 0.
My 0 bar is not calculated according to the formula.
Buffer[0]=price[0];
And then based on the price movement, the indicator will catch up with the trend
For example if the price has moved away from the indicator and will not move, then duringthe "period" of candle indicator will catch up the price, this is a kind of alternative to MA for me
My first indicator. I want to scale the symbol from 0 to 100. Am I doing it right? And how to make the current bar not to recalculate (in the tester it jerks, but not on the chart)
#property indicator_separate_window#property indicator_minimum 0#property indicator_maximum 100#property indicator_buffers 1#property indicator_plots 1//--- plot Label1#property indicator_label1 "Main"#property indicator_type1 DRAW_LINE#property indicator_color1 clrRed#property indicator_style1 STYLE_SOLID#property indicator_width1 1//--- indicator buffersdouble MainBuffer[];
//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+intOnInit()
{
//--- indicator buffers mappingSetIndexBuffer(0,MainBuffer,INDICATOR_DATA);
IndicatorSetString(INDICATOR_SHORTNAME,"NormSymbol");
IndicatorSetInteger(INDICATOR_DIGITS,2);
ArrayInitialize(MainBuffer, EMPTY_VALUE);
//---return(0);
}
//+------------------------------------------------------------------+//| Custom indicator iteration function |//+------------------------------------------------------------------+intOnCalculate(constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &spread[])
{
int first,bar,nLowBar=0,nHighBar=0;
int nVizCount = (int)ChartGetInteger(0, CHART_VISIBLE_BARS);
if(prev_calculated==0) // проверка на первый старт расчёта индикатора
{
first=0; // стартовый номер для расчёта всех баров
}
else
{
first=prev_calculated-1; // стартовый номер для расчёта новых баров
}
//---- основной цикл расчёта индикатораfor(bar=first; bar<rates_total; bar++)
{
nLowBar =ArrayMinimum(low, bar, nVizCount);
nHighBar=ArrayMaximum(high, bar, nVizCount);
if(nLowBar>0 && nHighBar>0 && high[nHighBar]-low[nLowBar]!=0)
{
MainBuffer[bar]=((close[bar] -low[nLowBar])/(high[nHighBar]-low[nLowBar]))*100;
}
else
{
MainBuffer[bar]=EMPTY_VALUE;
}
}
//--- return value of prev_calculated for next callreturn(rates_total);
}
Konstantin83: how to make the current bar not recalculate
Memorise the opening time of the current bar and compare it with the same value of the incoming tick. Only recalculate the value of the current bar when the values do not match.
Memorise the opening time of the current bar and compare it with the same value of the incoming tick. Only recalculate the value of the current bar when the values do not match.
I haven't noticed anything else. The articles suggest a similar structure. There is a check for division by zero.
Yes, to avoid recalculating, you can also compare prev_calculated and rates_total, as far as I remember.
Do you know why the indicator does not draw the line after closing the terminal and restarting the terminal? If you switch to another timeframe, it is drawn.
Konstantin83: Do you know why after closing the terminal with the indicator and restarting the terminal the indicator does not draw a line? If you switch to another timeframe, it will be drawn.
The terminal needs some time to "get up", synchronise its databases with the server, etc. when starting up. If the indicator is launched at the same time, there may be no data for the indicator calculation. Try the easiest solution: to insert a delay of two or three seconds into OnInit().
In general, it is desirable to print all important information when searching for a problem area. Like
Changed to this
Seems to be working.your arrays are not serialized.
that's why it's this.
Buffer[i+1]=Buffer[i]+delta;peeking into the future
It doesn't recalculate 0 bar - for the same reason - your start - it doesn't start with 0.
your arrays are not serialized.
so that's why it's this.
peeking into the future.
It doesn't recalculate 0 bar for the same reason you don't start with 0.
My 0 bar is not calculated according to the formula.
And then based on the price movement, the indicator will catch up with the trend
For example if the price has moved away from the indicator and will not move, then duringthe "period" of candle indicator will catch up the price, this is a kind of alternative to MA for me
lazarev-d-m:
it's kind of an alternative to MA for me
My first indicator. I want to scale the symbol from 0 to 100. Am I doing it right? And how to make the current bar not to recalculate (in the tester it jerks, but not on the chart)
Memorise the opening time of the current bar and compare it with the same value of the incoming tick. Only recalculate the value of the current bar when the values do not match.
I would put this in the initialization block:
and the variables would be declared at the global level of the program:
Memorise the opening time of the current bar and compare it with the same value of the incoming tick. Only recalculate the value of the current bar when the values do not match.
I would put this in the initialisation block:
I haven't noticed anything else. The articles suggest a similar structure. There is a check for division by zero.
Yes, to avoid recalculating, you can also compare prev_calculated and rates_total, as far as I remember.
I haven't noticed anything else. The articles suggest a similar structure. There is a check for division by zero.
Yes, to avoid recalculating, you can also compare prev_calculated and rates_total, as far as I remember.
The terminal needs some time to "get up", synchronise its databases with the server, etc. when starting up. If the indicator is launched at the same time, there may be no data for the indicator calculation. Try the easiest solution: to insert a delay of two or three seconds into OnInit().
In general, it is desirable to print all important information when searching for a problem area. Like
Yedelkin:
I haven't found any help for live trading yet - just try opening and closing a position in a demo account.
Here it is: https://www.mql5.com/ru/forum/6343/page96#comment_419028