Сбой в MetaTarder?

 
Здравствуйте!

Почему следующий код

double USD_Index(int i, int timeframe)
{
   string pairs[6] =
   {
      "USDCHF", "USDJPY", "USDCAD", "EURUSD", "GBPUSD", "AUDUSD"
   };
   
   double index = iClose(pairs[0], timeframe, i);
   
   for (int j=1; j<3; j++) index += iClose(pairs[j], timeframe, i);
   for (j=2; j<6; j++) index += 1.0/iClose(pairs[j], timeframe, i);
   
   return(index/6.0);
}
работает на графиках вплоть до D1, но не работает на W1 и MN?

P.S. В поисках ошибки, если в index += 1.0/iClose(pairs[j], timeframe, i) убрать деление, т.е. заменить на index += iClose(pairs[j], timeframe, i), то программа работает на всех таймфреймах.
 
А деления на ноль не может возникнуть из-за отсутствия какого-нибудь бара? Попробуйте проверку вставить:
for (j=2; j<6; j++)
{
  double x = iClose(pairs[j], timeframe, i);
  if (x>0) index += 1.0 / x;
} 
А строку:
for (int j=1; j<3; j++) index += iClose(pairs[j], timeframe, i);
может лучше записать так?
for (int j=0; j<3; j++) index += iClose(pairs[j], timeframe, i);
Да и в следующей строке 2 надо бы исправить на 3.
 
Действительно, так оно и выходит. Спасибо!
Вот исправленный и работающий вариант кода:

double USD_Index(int i, int timeframe)
{
   string pairs[6] =
   {
      "USDCHF", "USDJPY", "USDCAD", "EURUSD", "GBPUSD", "AUDUSD"
   };
   
   double index = iClose(pairs[0], timeframe, i);
   
   for (int j=1; j<3; j++) index += iClose(pairs[j], timeframe, i);
   for (j=3; j<6; j++)
      if (iClose(pairs[j], timeframe, i) > 0)
         index += 1.0/iClose(pairs[j], timeframe, i);
   
   return(index/6.0);
}

Вы не знаете, почему бар может исчезнуть?

 
volodja:
Вы не знаете, почему бар может исчезнуть?
Нет, не знаю. Предполагаю, что его вообще не было.

Встречный вопрос. А Вы не знаете, почему у Вас опрос массива pairs[6] начинается со второго элемента, то есть с j=1?
 
Дело в том, что первый элемент уже был опрошен в строке
double index = iClose(pairs[0], timeframe, i);
Поэтому дальнейший опрос массива ведется со второго элемента. Т.е. я сократил количество выполняемых операций на единицу (лишней была бы инициализация нулем: double index = 0;, т.к. index можно сразу проинициализировать первым элементом массива). Хотя такая мелочь не влияет на скорость работы программы, все равно приятно, когда лишнее отсутствует...
 

Я хотел написать программу для вывода графиков индексов отдельных валют (здесь была приведена функция подсчета индекса USD).

Интерфейс программы довольно неуклюжий, т.к. чтобы выбирать между валютами, по которым будет подсчитан индекс, в программе введена внешняя переменная c_number. Ее значениям соответствуют различные валюты, напр. USD соответствует c_number=0, EUR соответствует c_number=1 и т.д.

Хотелось бы, чтобы в свойствах индикатора была возможность выбирать валюту из меню (т.е. нужно создать меню), т.к. никогда не упомнишь какая цифра за что отвечает. Еще было бы неплохо, если бы можно было в том же окне со свойствами выбирать для данной валюты соотв. валютные пары, по которым будет считатьсяи индекс.

Мне кажется, в MetaTrader этого сделать не получится. Или можно как-то ухитриться?

 
volodja:

Хотелось бы, чтобы в свойствах индикатора была возможность выбирать валюту из меню (т.е. нужно создать меню), т.к. никогда не упомнишь какая цифра за что отвечает. Еще было бы неплохо, если бы можно было в том же окне со свойствами выбирать для данной валюты соотв. валютные пары, по которым будет считатьсяи индекс.

Мне кажется, в MetaTrader этого сделать не получится. Или можно как-то ухитриться?


Всё что вы хотите вполне реализуемо в МТ4.
Насчёт создания меню и интерактивного управления запущенным экспертом можно глянуть пример вот здесь:
'Графический эксперт AutoGraf'
 

Спасибо за ссылку! На днях обязательно разберусь со статьей.

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