не пересчитывается 0 бар - по то йже причине - у вас start - не с 0 ведь начинается
У меня 0 бар расчитывается не по формуле
Buffer[0]=price[0];
А дальше уже на основе движения цены индикатор догоняте тренд
Например при условии что цена ушла от индикатра и не будет двигаться, то за "period" свечей индикатор догонит цену, это своего рода альтернатива MA для меня
Первый мой индикатор. Хочу отмаштабировать символ от 0 до 100. Правильно ли я делаю? И как сделать чтобы текущий бар не пересчитывался (в тестере дергается, а на графике нет)
#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: как сделать чтобы текущий бар не пересчитывался
Запомнить время открытия текущего бара и сравнивать его с аналогичным показателем приходящего тика. Пересчитывать значения текущего бара только когда, когда значения не совпадают.
Запомнить время открытия текущего бара и сравнивать его с аналогичным показателем приходящего тика. Пересчитывать значения текущего бара только когда, когда значения не совпадают.
Да больше ничего не заметил. В статьях предлагается аналогичная структура. Проверка деления на ноль есть.
Да, чтоб не пересчитывать, ещё можно сравнивать prev_calculated и rates_total, насколько помню.
А не знаете почему после закрытия терминала с индикатором и последующим запуском терминала индикатор не рисует линию? Если перейти на другой таймфрэйм то он отрисовывается.
Konstantin83: А не знаете почему после закрытия терминала с индикатором и последующим запуском терминала индикатор не рисует линию? Если перейти на другой таймфрэйм то он отрисовывается.
Терминалу при запуске требуется некоторое время, чтобы "подняться", синхронизировать свои базы с сервером и пр. Если одновременно запускается и индикатор, то вполне может быть, что данных для расчёта индикатора ещё нет. Попробуйте самое тупое решение: вставить в OnInit() задержку на пару-тройку секунд.
По-хорошему же желательно при поиске проблемного места выводить на печать все важные сведения. Типа
Изменил на это
Вроде бы работаету вас массивы не серийные.
поэтому вот это -
Buffer[i+1]=Buffer[i]+delta;подглядываете в будущее
не пересчитывается 0 бар - по то йже причине - у вас start - не с 0 ведь начинается
у вас массивы не серийные.
поэтому вот это -
подглядываете в будущее
не пересчитывается 0 бар - по то йже причине - у вас start - не с 0 ведь начинается
У меня 0 бар расчитывается не по формуле
А дальше уже на основе движения цены индикатор догоняте тренд
Например при условии что цена ушла от индикатра и не будет двигаться, то за "period" свечей индикатор догонит цену, это своего рода альтернатива MA для меня
lazarev-d-m:
это своего рода альтернатива MA для меня
Первый мой индикатор. Хочу отмаштабировать символ от 0 до 100. Правильно ли я делаю? И как сделать чтобы текущий бар не пересчитывался (в тестере дергается, а на графике нет)
Запомнить время открытия текущего бара и сравнивать его с аналогичным показателем приходящего тика. Пересчитывать значения текущего бара только когда, когда значения не совпадают.
Вот это я бы вынес в блок инициализации:
а переменные объявил бы на глобальном уровне программы:
Запомнить время открытия текущего бара и сравнивать его с аналогичным показателем приходящего тика. Пересчитывать значения текущего бара только когда, когда значения не совпадают.
Вот это я бы вынес в блок инициализации:
Да больше ничего не заметил. В статьях предлагается аналогичная структура. Проверка деления на ноль есть.
Да, чтоб не пересчитывать, ещё можно сравнивать prev_calculated и rates_total, насколько помню.
Да больше ничего не заметил. В статьях предлагается аналогичная структура. Проверка деления на ноль есть.
Да, чтоб не пересчитывать, ещё можно сравнивать prev_calculated и rates_total, насколько помню.
Терминалу при запуске требуется некоторое время, чтобы "подняться", синхронизировать свои базы с сервером и пр. Если одновременно запускается и индикатор, то вполне может быть, что данных для расчёта индикатора ещё нет. Попробуйте самое тупое решение: вставить в OnInit() задержку на пару-тройку секунд.
По-хорошему же желательно при поиске проблемного места выводить на печать все важные сведения. Типа
Yedelkin:
Для торговли в режиме текущего времени пока не нашёл справки - попробуйте просто открыть и закрыть позицию на демо-счете.
Вот, нашёл: https://www.mql5.com/ru/forum/6343/page96#comment_419028