Ошибки, баги, вопросы - страница 31

 
Urain:
Может, но ведь иногда работает, хотя когда задаю 3 то в коротком имени отрисовываеться 3 значения а мне нужно только одно основного буфера.

Тогда может вот так:

#property indicator_buffers 3
#property indicator_plots   1
   SetIndexBuffer(0,LRma,INDICATOR_DATA);
   SetIndexBuffer(1,L,INDICATOR_CALCULATIONS);
   SetIndexBuffer(2,S,INDICATOR_CALCULATIONS);

На графике выводится только одно значение.

 
DC2008:

Тогда может вот так:

На графике выводится только одно значение.

Вот как раз так и получаеться что в коротком имени индикатора отображаеться 3 числа тогда как буфер для рисования один он же хранит всё что нужно знать,

проблема в том что в 4 можно было просто запросить значение машки на нужном баре а тут приходиться грузить весь буфер и соответственно гдето его хранить

хотя для нужд индикатора это самое хранение не нужно. Но как получить значение машки по другому не знаю.

 
DC2008:

Тогда может вот так:

На графике выводится только одно значение.

Тоже глючит по страшному....
 
Interesting:

Там не в инициализации дело. И даже не в тех двух строчках которые Машек вызывают.

Если даже предположить тот факт что параметр СИМВОЛ действительно нужен там (лично я в этом сомневаюсь), работа с буферами хромает, а про блок калькулятора я вообще молчу...

Ага вижу разобрались что индикатор отображает значение угла линейной регрессии не того инструмента на котором запущен,

а того что прописан в инпуте, значит надеюсь шашку спрячите.

Теперь уже по холодочку, рассудительно  скажите в чём видите несуразность того что происходит в калькулятэ ???

Я не утверждаю что там всё правильно (так как только учу пятёру ну и естевственно парюсь как и многие).

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

хотя разработчики уверяли что терминал сам всё нужное подгрузит.

 
Urain:

Вот как раз так и получаеться что в коротком имени индикатора отображаеться 3 числа тогда как буфер для рисования один он же хранит всё что нужно знать,

проблема в том что в 4 можно было просто запросить значение машки на нужном баре а тут приходиться грузить весь буфер и соответственно гдето его хранить

хотя для нужд индикатора это самое хранение не нужно. Но как получить значение машки по другому не знаю.

Машки сами по себе получаются верно, ну или почти врно. С остальными буферами можно тоже разобраться (серии правда не применяются, что странно). А вот в калькуляторе что творится большой вопрос...
 
Urain:

Ага вижу разобрались что индикатор отображает значение угла линейной регрессии не того инструмента на котором запущен,

а того что прописан в инпуте, значит надеюсь шашку спрячите.

Теперь уже по холодочку, рассудительно  скажите в чём видите несуразность того что происходит в калькулятэ ???

Я не утверждаю что там всё правильно (так как только учу пятёру ну и естевственно парюсь как и многие).

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

хотя разработчики уверяли что терминал сам всё нужное подгрузит.


А что тут рассуждать. Берем шапку калькулятора и что мы там видим, а видим мы там вот что:

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 count=rates_total-prev_calculated;
   if(count==0)count=1;
Рассчитываем один инстумент, а бары считаем по другому. Вот и скажите мне где логика?
 

Я вот тут переписал калькулятэ вот таким образом :

  {
//---
   int count=rates_total-prev_calculated;
   if(count>_Bars())count=_Bars()-1;
   if(count==0)count=1;
   if(CopyBuffer(Lwma,0,0,count,L)!=-1)
     {
      if(CopyBuffer(Sma,0,0,count,S)!=-1)
        {
         for(int i=0;i<count;i++)
            LRma[i]=(L[i]-S[i])*6*iPoint*iiMA;
        }
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
int _Bars(){return(Bars(symbol,_Period));}
записи об ошибках исчезли но работать всё равно не работает как надо.
 

Вот тут мы ломали головы над подобным индюком. Посмотрите что вышло из этого

 
Urain:

Я вот тут переписал калькулятэ вот таким образом :

записи об ошибках исчезли но работать всё равно не работает как надо.

Единственный правильный путь тут очень простой.

Пишется 100% работающий индикатор, причем он делается классически без параметра "Символ", т.е. расчитывается по текущему символу и периоду.

После чего такой БАЗОВЫЙ калькулятор вызывается в эксперте (если предусмотрена механическая работа) или калькуляторе (если необходимо отображать инфу на графике НЕ РАСЧЕТНОГО ИНСТРУМЕНТА).

PS

В противном случае если делать все по уму придется в калькуляторе или отдельной функции делать дополнительный расчет, после чего увязывать результаты с данными по текущему графику...

 
Urain:

Я вот тут переписал калькулятэ вот таким образом :

записи об ошибках исчезли но работать всё равно не работает как надо.

Наверно лучше так:

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot LRma
#property indicator_label1  "LRma"
#property indicator_type1   DRAW_LINE
#property indicator_color1  Red
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
input string             symbol      ="EURJPY";
input int                MA_Period   =25;          // период MA
input int                MA_shift    =0;           // сдвиг индикатора
input ENUM_APPLIED_PRICE price       =PRICE_OPEN;  // тип цены 
//--- indicator buffers
double  LRma[],L[],S[],iPoint,iiMA;

int Lwma,Sma;// Хендлы машек
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,LRma,INDICATOR_DATA);
   ArraySetAsSeries(L,true);
   ArraySetAsSeries(S,true);
   ArraySetAsSeries(LRma,true);
   Lwma=iMA(symbol,0,MA_Period+1,MA_shift,MODE_LWMA,price);
   Sma=iMA(symbol,0,MA_Period+1,MA_shift,MODE_SMA,price);
   iPoint=1.0/SymbolInfoDouble(symbol,SYMBOL_POINT);
   iiMA=1.0/MA_Period;
   IndicatorSetString(INDICATOR_SHORTNAME,"LRma_symbol_"+symbol);
//---
   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 count=rates_total-prev_calculated;
   if(count>1)count=(int)SeriesInfoInteger(symbol,0,SERIES_BARS_COUNT);
   if(count==0)count=1;
   if(CopyBuffer(Lwma,0,0,count,L)!=-1)
     {
      if(CopyBuffer(Sma,0,0,count,S)!=-1)
        {
         for(int i=0;i<MathMin(ArraySize(LRma),ArraySize(L));i++)
            LRma[i]=(L[i]-S[i])*6*iPoint*iiMA;
        }
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Работает вроде корректно.

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