Вопросы от "чайника" - страница 235

 
lazarev-d-m:

Изменил на это

Вроде бы работает

 

у вас массивы не серийные.

поэтому вот это -

Buffer[i+1]=Buffer[i]+delta;

подглядываете в будущее


не пересчитывается 0  бар - по то йже причине - у вас start - не с 0 ведь начинается

 
sergeev:

у вас массивы не серийные.

поэтому вот это -

подглядываете в будущее


не пересчитывается 0  бар - по то йже причине - у вас start - не с 0 ведь начинается

У меня 0 бар расчитывается не по формуле

Buffer[0]=price[0]; 

А дальше уже на основе движения цены индикатор догоняте тренд

Например при условии что цена ушла от индикатра и не будет двигаться, то за  "period" свечей индикатор догонит цену, это своего рода альтернатива MA для меня

 

lazarev-d-m:

это своего рода альтернатива MA для меня

с заглядыванием на 1 бар в будущее вы эту альтернативу можете смело выкидывать в мусорку
 

Первый мой индикатор. Хочу отмаштабировать символ от 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 buffers
double         MainBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);
   IndicatorSetString(INDICATOR_SHORTNAME,"NormSymbol");
   IndicatorSetInteger(INDICATOR_DIGITS,2);
   ArrayInitialize(MainBuffer, EMPTY_VALUE);

//---
   return(0);
  }
  
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &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 call

   return(rates_total);
  }
 
Konstantin83: как сделать чтобы текущий бар не пересчитывался 

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

Вот это я бы вынес в блок инициализации:

   nVizCount = (int)ChartGetInteger(0, CHART_VISIBLE_BARS);
   

а переменные объявил бы на глобальном уровне программы:

int first,bar,nLowBar=0,nHighBar=0, nVizCount; 
 
Yedelkin:

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

Вот это я бы вынес в блок инициализации:

 

Спасибо. А в общем все правильно?
 
Konstantin83: А в общем все правильно?

 Да больше ничего не заметил. В статьях предлагается аналогичная структура. Проверка деления на ноль есть.

Да, чтоб не пересчитывать, ещё можно сравнивать prev_calculated и rates_total, насколько помню.

 
Yedelkin:

 Да больше ничего не заметил. В статьях предлагается аналогичная структура. Проверка деления на ноль есть.

Да, чтоб не пересчитывать, ещё можно сравнивать prev_calculated и rates_total, насколько помню.

А не знаете почему после закрытия терминала с индикатором и последующим запуском терминала индикатор не рисует линию? Если перейти на другой таймфрэйм то он отрисовывается.
 
Konstantin83: А не знаете почему после закрытия терминала с индикатором и последующим запуском терминала индикатор не рисует линию? Если перейти на другой таймфрэйм то он отрисовывается.

Терминалу при запуске требуется некоторое время, чтобы "подняться", синхронизировать свои базы с сервером и пр. Если одновременно запускается и индикатор, то вполне может быть, что данных для расчёта индикатора ещё нет. Попробуйте самое тупое решение: вставить в OnInit() задержку на пару-тройку секунд.

По-хорошему же желательно при поиске проблемного места выводить на печать все важные сведения. Типа

if(nLowBar<0) Print("Ошибка, nLowBar=",nLowBar,", prev_calculated=",prev_calculated,", bar=",bar);
 

Yedelkin:

forward666: нужна визуализация

 Для торговли в режиме текущего времени пока не нашёл справки - попробуйте просто открыть и закрыть позицию на демо-счете. 

 Вот, нашёл: https://www.mql5.com/ru/forum/6343/page96#comment_419028 

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