Скачать MetaTrader 5

Проблема с использованием массива в эксперте.

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Ищешь единомышленников? На форуме их много!
Forex Trader
114257
Forex Trader 2007.07.10 13:01 
Подскажите, в чем может быть дело.
В индикаторе этот код работает, а когда я запускаю этот же код в эксперте в тестере стратегий, то увы :((
Проблема, в том, что массив bbMacd получается нулевым, т.е. все элементы массива равны 0, хотя должен был рассчитаться MACD.
Ниже проблемный код:
int    FastLen = 12;
int    SlowLen = 26;

double bbMacd[];

int init()
{
  IndicatorBuffers(1);  
  SetIndexBuffer(0, bbMacd);
  return(0);
}

void BB_MACD_ind()
{
  int limit;
  int counted_bars = IndicatorCounted();
//---- check for possible errors
//  if(counted_bars < 0) 
//    return(false);
//---- last counted bar will be recounted
  if(counted_bars > 0) 
    counted_bars--;
  limit = Bars - counted_bars;
//----
  for(int i = 0; i < limit; i++)
    bbMacd[i] = iMA(NULL, 0, FastLen, 0, MODE_EMA, PRICE_CLOSE, i) - 
                iMA(NULL, 0, SlowLen, 0, MODE_EMA, PRICE_CLOSE, i);
                
}


Forex Trader
114257
Forex Trader 2007.07.10 13:15  
Подскажите, в чем может быть дело.
.......................


Вы не выделили память под массив. В индикаторе Вы связали указатель на массив (это то, что описано как double bbMacd[]; с одним из индикаторных буферов, память под которые выделена.
SetIndexBuffer(...);
В советнике буферов нет и просто некуда записывать данные.
Странно, что терминал не "падает" с крэшем - это наверное было бы полезнее.

Для того, чтобы память была выделена статически под N элементов нужно описывать double bbMacd[ N]; где N - заданное число, например. double bbMacd[ 100]; выделит память под 100 элементов типа double.
Для динамического размещения - функция ArrayResize :
int ArrayResize( object&array[], int new_size)
Устанавливает новый размер в первом измерении массива. При успешном выполнении функция возвращает количество всех элементов, содержащихся в массиве после изменения размера, в противном случае возвращает -1, и массив не меняет размеры.
Замечание: массив, объявленный на локальном уровне в какой-либо функции, у которого был изменен размер, останется неизменным после завершения работы функции. При повторном вызове функции такой массив будет иметь размер, отличный от объявленного.


Успехов.
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий