Отображение буфера в индикаторе - страница 2

 
Михаил:

А может и не должно...

Я заполняю буфер ровно по его размеру (без пропусков).

Откуда берётся "0", если я в буфер его не помещаю? 

Должно, должно.

В вашем коде разбираться не стал, но рабочий пример написал, сможете разобраться:

//+------------------------------------------------------------------+
//|                                                       iTicks.mq4 |
//|                                      Copyright © 2015, komposter |
//|                                          http://www.komposter.me |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2015, komposter"
#property link      "http://www.komposter.me"
#property version   "1.00"

//---
#property indicator_separate_window
#property indicator_buffers                     1
#property indicator_plots                               1

//---
input string                                    Main_Properties                 = "";                                   // Main properties:
input int                                               MaxTicksOnChart         = 50;                                   // * Max Ticks On Chart

//--- plot
#property indicator_label1  "bid"
#property indicator_type1   DRAW_SECTION
#property indicator_color1  clrWhite
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1

//--- indicator buffers
double         bid[];
int                             prev_rates_total = 0;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{
        int buffer_index = -1, plot_index = -1;

//--- Colors
        buffer_index ++;
        SetIndexBuffer(buffer_index,bid,INDICATOR_DATA);

//--- indicator buffers mapping
        plot_index ++;
        PlotIndexSetString (plot_index,PLOT_LABEL, "Bid" );
        PlotIndexSetInteger(plot_index,PLOT_DRAW_TYPE,DRAW_SECTION );

//---
        ArraySetAsSeries( bid, true );

        prev_rates_total = 0;

//---
   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| 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[])
{
//---
        MqlTick last_tick;
        if ( !SymbolInfoTick( _Symbol, last_tick ) ) return(0);

//---
        if ( prev_rates_total == 0 )
        {
                ArrayInitialize( bid, EMPTY_VALUE );
        }

//--- Новых баров нет
        if ( rates_total == prev_rates_total )
        {
                // Сдвигаем данные
                for ( int i = MaxTicksOnChart-1; i > 0; i -- )
                {
                        bid[i] = bid[i-1];
                }
        }
        else
        {
                prev_rates_total = rates_total;

                // удаляем старое значение
                bid[MaxTicksOnChart]= EMPTY_VALUE;
        }

//--- Заполняем последнее значение
        bid[0] = last_tick.bid;

//--- return value of prev_calculated for next call
        return(rates_total);
}

 

Тут только проверки на MaxTicksOnChart >= rates_total нет, а так все работает:

 

 
Михаил:

Зачем удаляете сообщения с работающим кодом? Зачем вообще обсуждение, если потом его стирать?

Или он перестал работать? 

 
Andrey Khatimlianskii:

Зачем удаляете сообщения с работающим кодом? Зачем вообще обсуждение, если потом его стирать?

Или он перестал работать? 

Он проработал 3 часа, а потом "загнулся" (одно из значений = 0 ) :(

 Потом до 23-50 опять работал нормально..

Это баг "плавающий" :( 

Кстати, Ваш код совершенно не приемлем для задач, которые я перед собой ставлю.

За 1 OnCalculate() в AskTemp( BidTemp) приходит более 200 значений (event_cnt = 242 

В Вашей реализации, потеряется 241 значение из 242.

В мой реализации тоже будут потери (пока считается OnCalculate() ), но потери будут несоизмеримо меньше. 

И какой смысл принудилельно ограничивать размер вычислений в буфере? Ведь у буфера есть КОНКРЕТНЫЙ размер,

который можно использовать. На моём тестируемом инструменте он - rates total = 32279; prev calc = 32279;

 

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate( const int rates_total,
                 const int prev_calculated,
                 const int begin,
                 const double &price[] )

{
  if ( prev_calculated == 0 )
  {
    for( int i = rates_total - 1; i >= 0; i-- )
    {
      AskBuffer[i] = EMPTY_VALUE;
      BidBuffer[i] = EMPTY_VALUE;
    }
  }
  else
  {
    event_cnt = ArraySize( AskTemp );
    if ( event_cnt != ArraySize( BidTemp ) || ( event_cnt == 0 ) )
    {
      Print( "Буферы данных не совпадают или размер буфера равен 0!" );
      event_cnt = 0;
      return( rates_total );
    }
//---
    if ( event_cnt >= rates_total )
    {
      for( int i = rates_total - 1; i >= 0; i-- )
      {
        AskBuffer[i] = AskTemp[i];
        BidBuffer[i] = BidTemp[i];
      }
    }
    else
    {
      int n_diff = rates_total - prev_calculated;
//---
      for( int i = rates_total - 1; i >= 0; i-- )
      {
        if ( i > ( event_cnt - 1 ) )
        {
          AskBuffer[i] = AskBuffer[i - event_cnt + n_diff];
          BidBuffer[i] = BidBuffer[i - event_cnt + n_diff];
          if ( ( NormalizeDouble( AskBuffer[i], 0 ) == 0 ) && ( NormalizeDouble( BidBuffer[i], 0 ) == 0 ) )
          {
            Print( " n_diff = ", n_diff );
            Print( "Сдвиг значений буферов. i = ", i, "; rates total = ", rates_total,
                   "; prev calc = ", prev_calculated, "; event cnt = ", event_cnt, 
                   "; Ask buff = ", AskBuffer[i], "; Bid buff = ", BidBuffer[i] );
          }          
        }
        else
        {
          AskBuffer[i] = AskTemp[i];
          BidBuffer[i] = BidTemp[i];
          if ( ( NormalizeDouble( AskBuffer[i], 0 ) == 0 ) && ( NormalizeDouble( BidBuffer[i], 0 ) == 0 ) )
          {
            Print( " n_diff = ", n_diff );
            Print( "Заполнение новыми значениями. i = ", i, "; rates total = ", rates_total,
                   "; prev calc = ", prev_calculated, "; event cnt = ", event_cnt, 
                   "; Ask buff = ", AskBuffer[i], "; Bid buff = ", BidBuffer[i] );
          }          
        }
      }
    }   
    event_cnt = 0;
  }
  IndicatorSetDouble( INDICATOR_LEVELVALUE, 0, LevelHigh );
  IndicatorSetDouble( INDICATOR_LEVELVALUE, 1, LevelExitHigh );
  IndicatorSetDouble( INDICATOR_LEVELVALUE, 2, LevelLow );
  IndicatorSetDouble( INDICATOR_LEVELVALUE, 3, LevelExitLow );
//--- 
  return( rates_total );
}
 
Михаил:

Он проработал 3 часа, а потом "загнулся" :(

 Потом до 23-50 опять работал нормально..

Это баг "плавающий" :( 

Кстати, Ваш код совершенно не приемлем для задач, которые я перед собой ставлю.

За 1 OnCalculate() в AskTemp( BidTemp) приходит более 200 значений (event_cnt = 242 

В Вашей реализации, потеряется 241 значение из 242.

В мой реализации тоже будут потери (пока считается OnCalculate() ), но потери будут несоизмеримо меньше. 

 

А среди этих более 200 значений много EMPTY_VALUE

Кстати, не загнуться не мог, поскольку нумерация баров в таймсериях изменилась, а Вы по этому поводу не обеспокоились.  

 
Алексей Тарабанов:
А среди этих более 200 значений много EMPTY_VALUE

Ни одного!

Это значения Ask и Bid, 

которые "собираются" в OnBookEvent(). 

Кстати, не загнуться не мог, поскольку нумерация баров в таймсериях изменилась, а Вы по этому поводу не обеспокоились.  

 Почему не побеспокоился?

Из чего это следует? 

 

//+------------------------------------------------------------------+
// Custom indicator On book event function                           |
//+------------------------------------------------------------------+
void OnBookEvent( const string& a_symbol )
{
  double prim_sell_price, prim_buy_price,
         sec_sell_price, sec_buy_price;
//---  
  if ( ( a_symbol == _Symbol ) || ( a_symbol == sec_symbol ) )
  {
    GetStakanValues( _Symbol, prim_sell_price, prim_buy_price );
    GetStakanValues( sec_symbol, sec_sell_price, sec_buy_price );
//---    
    ArrayResize( AskTemp, event_cnt + 1 );
    ArrayResize( BidTemp, event_cnt + 1 );
    AskTemp[0] = ( prim_sell_price + sec_sell_price ) / _Point;
    BidTemp[0] = ( prim_buy_price + sec_buy_price ) / _Point; 
//---     
    event_cnt++;
  }
}
 
Михаил:

Ни одного!

Это значения Ask и Bid, 

которые "собираются" в OnBookEvent(). 

В конце OnCalculate: 

            StumbleTime=Time[StumbleBar];

В начале:  


          StumbleBar=iBarShift(NULL,0,StumbleTime),

 
Алексей Тарабанов:
В конце OnCalculate: 

            StumbleTime=Time[StumbleBar];

В начале:  


          StumbleBar=iBarShift(NULL,0,StumbleTime),

Извините, но судя по Вашим высказыванием, Вы вообще не понимаете сути дела! 

https://www.mql5.com/ru/forum/58908 

К разработчикам. Реал-тайм индикатор
К разработчикам. Реал-тайм индикатор
  • www.mql5.com
Сейчас в индикаторе значения буфера отображаются только из функции OnCalculate(). - - Категория: автоматические торговые системы
 
Михаил:

Извините, но судя по Вашим высказыванием, Вы вообще не понимаете сути дела! 

https://www.mql5.com/ru/forum/58908 

Михаил, ну а из какой еще функции индикаторы должны отображаться? 

К нашим баранам: Вы работаете на Н4, индикатор нормально функционирует 3 часа 50 минут (примерно), после появляется "плавающий баг". Враги? 

 
Алексей Тарабанов:

Михаил, ну а из какой еще функции индикаторы должны отображаться? 

К нашим баранам: Вы работаете на Н4, индикатор нормально функционирует 3 часа 50 минут (примерно), после появляется "плавающий баг". Враги? 

Забудьте про функции (не будут MQ делать реал-тайм, поэтому приходиться обходится тем, что есть) и ВРЕМЯ и таймфреймы!

Я работаю с индикаторными буферами, которые заполняю со смещением равным размеру буферов со вновь

поступившей информацией и (если пришел новый бар, то учитываю новый размер буфера).

Есть код, есть картинка https://www.mql5.com/ru/forum/59136#comment_1643539 с объяснением, что я делаю. Что же непонятного?

Топик начал, потому что график (одно значение), иногда, "схлопывается" в ноль, поэтому

и спрашиваю почему? 

Вчера перезагрузил Windows, так индикатор проработал правильно около 3-х часов (до перезагрузки правильно работал 3-5 мин), потом "схлопнулся",

потом до окончания вечерней сессии опять работал нормально. 

Отображение буфера в индикаторе
Отображение буфера в индикаторе
  • www.mql5.com
15,M1) сдвиг значений буферов. - - Категория: технические индикаторы и анализ рынка форекс
 
Михаил:

Забудьте про функции (не будут MQ делать реал-тайм, поэтому приходиться обходится тем, что есть) и ВРЕМЯ!

Я работаю с индикаторными буферами, которые заполняю со смещением равным размеру буферов со вновь

поступившей информацией и (если пришел новый бар, то учитываю новый размер буфера).

Есть код, есть картинка https://www.mql5.com/ru/forum/59136#comment_1643539 с объяснением, что я делаю. Что же непонятного?

Топик начал, потому что график (одно значение), иногда, "схлопывается" в ноль, поэтому

и спрашиваю почему? 

Потому, что никто не сказал этому значению, что оно должно быть EMPTY_VOLUME, а не остаться проинициализированным нулем по-умолчанию. 
Причина обращения: