Помогите, пожалуйста, новичку разобраться с использованием массивов в классах. Вырезал ключевой код в маленький кусок для представления проблемы:
class base
{
protected:
int Stf_ZZ_Handle;
double Stf_ZZ_Val[];
public:
void InitArray()
{
Stf_ZZ_Handle=iCustom(_Symbol,_Period,"Examples\\ZigZag",12,0,0);
ArraySetAsSeries(Stf_ZZ_Val,true);
CopyBuffer(Stf_ZZ_Handle,0,0,200,Stf_ZZ_Val);
Print("array[0]= ",Stf_ZZ_Val[0]);
}
};
class second : public base
{
public:
void Printer() {Print("array[0]= ",Stf_ZZ_Val[0]);}
};
intOnInit()
{
//---
base Cbase;
second Csecond;
Cbase.InitArray();
Csecond.Printer();
//---return(0);
}
При выполнение получаю ошибку Array out of range в строке класса наследника, в родительском классе получаю ожидаемый 0.
2012.02.13 00:41:25 2011.01.01 00:00:00 array out of range in 'test1.mq5' (29,36) 2012.02.13 00:41:25 2011.01.01 00:00:00 array[0]= 0.0
base Cbase;
second Csecond;
Cbase.InitArray();
Csecond.Printer();
Что я делаю не так?
Смотрите, при объявлении во второй строчке "second Csecond;" у Вас метод InitArray() не вызывается, правильно? При этом сам по себе объект Csecond уже создан. Вот и получается, что когда в четвёртой строчке обращаетесь к методу "Csecond.Printer();", обращение идёт к неинициализированному и неотразмеренному массиву Stf_ZZ_Val[].
Скажите, пожалуйста, снято ли ограничение в 1000 баров доступной истории с даты старта (как в МТ4) при тестировании?
Поясните, что Вы имеете в виду?
В пятёрке загружаются данные с предыдущего года от начала тестирования. То есть, если Вы тестируете с 2012.02.01 то данные будут подгружатьсяс 2011.01.01
Исключение составляет тестирование на днёвках, недельках и месяцовках - там расчёт начала данных ведётся из необходимости наличия 100 баров перед началом тестирования.
При запуске, напр. с 2011.01.01 по дневкам нужна история с, как минимум, 3000 баров. Т.е. приходится задавать заведомо больший период, чем нужно для тестирования, а "точку начала" отслеживать программно. В чем сложность предоставления всей (или по запросу) истории при тестировании?
muallch: При запуске, напр. с 2011.01.01 по дневкам нужна история с, как минимум, 3000 баров. Т.е. приходится задавать заведомо больший период, чем нужно для тестирования, а "точку начала" отслеживать программно. В чем сложность предоставления всей (или по запросу) истории при тестировании?
Сложности нет никакой. Мы не захотели вводить дополнительную галку в настройках тестирования, которая была бы непонятна большинству пользователей и в большом количестве случаев использовалась бы неверно.
Задавать заведомо больший период - это нормальное решение.
Есть ещё решение - заказать тестирование на месяцовке, а индикаторы и ценовые данные использовать дневные (то есть, вместо PERIOD_CURRENT явно выставлять PERIOD_D1)
В догонку: тестирую с удаленными агентами через инет. Почему агенты получают полный объем минутной истории, если я тестирую по ценам открытия дневок? Время подготовки перед началом тестов просто неприличное - час, например. Хорошо тем, у кого труба в 10-100 мегабит, а тут сидишь на жалкой мегабитке...
Здравствуйте всем!
Помогите, пожалуйста, новичку разобраться с использованием массивов в классах. Вырезал ключевой код в маленький кусок для представления проблемы:
При выполнение получаю ошибку Array out of range в строке класса наследника, в родительском классе получаю ожидаемый 0.
2012.02.13 00:41:25 2011.01.01 00:00:00 array out of range in 'test1.mq5' (29,36)
2012.02.13 00:41:25 2011.01.01 00:00:00 array[0]= 0.0
Я так понимаю что неправильно передаю (или обращаюсь) массив в класс наследник, хотя с обычными переменными при таком обращении ошибок не возникает.
Что я делаю не так?
Очень часто в последнее время вижу такое сообщение при запуске файлов *.mq5:
В чём может быть проблема?
Здравствуйте всем!
Что я делаю не так?
Смотрите, при объявлении во второй строчке "second Csecond;" у Вас метод InitArray() не вызывается, правильно? При этом сам по себе объект Csecond уже создан. Вот и получается, что когда в четвёртой строчке обращаетесь к методу "Csecond.Printer();", обращение идёт к неинициализированному и неотразмеренному массиву Stf_ZZ_Val[].
Скажите, пожалуйста, снято ли ограничение в 1000 баров доступной истории с даты старта (как в МТ4) при тестировании?
Поясните, что Вы имеете в виду?
В пятёрке загружаются данные с предыдущего года от начала тестирования. То есть, если Вы тестируете с 2012.02.01 то данные будут подгружатьсяс 2011.01.01
Исключение составляет тестирование на днёвках, недельках и месяцовках - там расчёт начала данных ведётся из необходимости наличия 100 баров перед началом тестирования.
Поясните, что Вы имеете в виду?
При запуске, напр. с 2011.01.01 по дневкам нужна история с, как минимум, 3000 баров. Т.е. приходится задавать заведомо больший период, чем нужно для тестирования, а "точку начала" отслеживать программно. В чем сложность предоставления всей (или по запросу) истории при тестировании?
Сложности нет никакой. Мы не захотели вводить дополнительную галку в настройках тестирования, которая была бы непонятна большинству пользователей и в большом количестве случаев использовалась бы неверно.
Задавать заведомо больший период - это нормальное решение.
Есть ещё решение - заказать тестирование на месяцовке, а индикаторы и ценовые данные использовать дневные (то есть, вместо PERIOD_CURRENT явно выставлять PERIOD_D1)
Кроме того, встает вопрос о доступности истории не при тестировании, а в реальной автоторговле. Как быть в этом случае? Тестер-то можно перехитрить...
Благодарю за разъяснения!
В догонку: тестирую с удаленными агентами через инет. Почему агенты получают полный объем минутной истории, если я тестирую по ценам открытия дневок? Время подготовки перед началом тестов просто неприличное - час, например. Хорошо тем, у кого труба в 10-100 мегабит, а тут сидишь на жалкой мегабитке...