Проблема с индикатором

 
Почему индикатор не работает при запуске терминала, но работает после смены таймфрейма?


#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots 1

MqlRates myRates[];
double myBuffer[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{
    ArraySetAsSeries(myRates,true);
    
    SetIndexBuffer( 0, myBuffer, INDICATOR_DATA );
    PlotIndexSetInteger( 0, PLOT_DRAW_TYPE, DRAW_LINE );
    PlotIndexSetInteger( 0, PLOT_LINE_STYLE, STYLE_SOLID );
    PlotIndexSetInteger( 0, PLOT_LINE_WIDTH, 1 );
    PlotIndexSetString( 0, PLOT_LABEL, "Test" );
    PlotIndexSetInteger( 0, PLOT_SHIFT, 0 );
    PlotIndexSetInteger( 0, PLOT_DRAW_BEGIN, 0 ); 
    PlotIndexSetDouble( 0, PLOT_EMPTY_VALUE, EMPTY_VALUE );
    PlotIndexSetInteger( 0, PLOT_LINE_COLOR, clrAliceBlue );

    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[])
  {
    if(IsStopped())
    {
        return(0); 
    }
       
    int start = 0;
    if ( prev_calculated != 0 )
    {
        start = prev_calculated - 1;
    }
    
    if(start < 0)
    {
        start = 0;
    }
    
    for( int i = rates_total - 1; i >= start; i-- )
    {
        int myDataCount = CopyRates( 
                        _Symbol,
                        ENUM_TIMEFRAMES::PERIOD_D1,
                        time[ i ],  
                        2,          
                        myRates );
                        
        if ( myDataCount == 2 )
        {
            myBuffer[ i ] = myRates[1].close;
        }
    }
        
    return(rates_total);
  }
 
liju1970:
Почему индикатор не работает при запуске терминала, но работает после смены таймфрейма?


После запуска какие ошибки видите в логе?

Две частые причины падения индикаторов это выход за пределы массива и деление на ноль.

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

 
liju1970:
Почему индикатор не работает при запуске терминала, но работает после смены таймфрейма?


if ( myDataCount == 2 )
        {
            myBuffer[ i ] = myRates[1].close;
        }
/// смотреть, думать и плакать
else 
{
   PrintFormat("что-то пошло не так");
}

в общем-то никто не обещал, что данные по D1 будут доступны на момент первого-же запуска индикатора

рецепты предлагают разные - от запроса iBars(PERIOD_D1) в OnInit;

до "при работе с другими символами и таймфреймами - учитывать что они асинхронны и надо самому разбираться с изменением доступной глубины истории и временем последнего бара". 

 
Alexandr Bryzgalov:

После запуска какие ошибки видите в логе?

Две частые причины падения индикаторов это выход за пределы массива и деление на ноль.

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

Ошибок в журнале нет.
 
Maxim Kuznetsov:

в общем-то никто не обещал, что данные по D1 будут доступны на момент первого-же запуска индикатора

рецепты предлагают разные - от запроса iBars(PERIOD_D1) в OnInit;

до "при работе с другими символами и таймфреймами - учитывать что они асинхронны и надо самому разбираться с изменением доступной глубины истории и временем последнего бара". 

Хорошо, я переработал код и теперь обхожусь без CopyRates().

Теперь это работает!