Roman Sharanov: Как создать массив экземпляров класса? Сделал ClassName* className[], потом на него ArrayResize, но не дает доступ к методамinvalid pointer access
Ваш класс, экземпляры которого хотите в массив собирать, должен быть наследован от CObject.
А далее всё просто: создаёте список (массив) объектов CArrayObj, и в него добавляете свои объекты.
Вы если говорите что плохо, скажите как сделать хорошо. Перенести вычисления в OnInit?
Справедливый упрек )) Вот, вариант кода, который был опубликован здесь:
intOnCalculate(constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &spread[])
{
int i,limit;
if(prev_calculated == 0) {
limit = rates_total - 1; //--- Первый вызов индикатора или смена таймфрейма или подгрузка данных из истории
}
else limit = rates_total - prev_calculated + 1;
for(i = limit; i >= 0; i--) { //--- В этом цикле основные вычисления. Таким образом обрабатываться будет только "свежая" информация
}
return(rates_total);
Попробуйте так делать. А в OnInit ничего переносить не надо.
это мое, куда же проще? ))) (по крайней мере у меня тоже в шаблоне есть комментарий limit = rates_total - 1; //--- Первый вызов индикатора или смена таймфрейма или подгрузка данных из истории) и мой стиль форматирования одна фигурная скобка около for() {
ну а по сабжу, чтобы научиться написать свой индикатор, берем шаблон указанный выше и добавляем хотя бы цену закрытия и получаем свой первый индикатор, потом учимся от этой цены закрытия делать МАшку
for(i = limit; i >= 0; i--) { //--- В этом цикле основные вычисления. Таким образом обрабатываться будет только "свежая" информация
Buffer[i] = close[i];
}
Это не Ваш код. Публиковал кто то из коллег, но кто и где, я не могу вспомнить. Я этот код и имел в виду, когда написал, что в OnInit ничего не надо переносить, а не исходный. Не точно выразился.
А Вы какую конструкцию рекомендовали бы? Эта вроде бы проста предельно.
А, вот и автор фрагмента )))) Опередил меня. Кстати, я тоже такой стиль форматирования использую - с одной открывающейся фигурной скобкой в строке.
Andrei Novichkov: А, вот и автор фрагмента )))) Опередил меня. Кстати, я тоже такой стиль форматирования использую - с одной открывающейся фигурной скобкой в строке.
ага, код шаблона индикатора чем хорош? запускаешь визард по созданию индикатора, выбираешь типы и цвет линий и если нужно добавляешь input 'ы
и все, индикатор готов, потом копируй из OnCalculate() шаблона тело и пиши расчеты,
свой первый индикатор можно написать за 1 минуту, выше код "Hello word I indicator!!!" - я показал :)
ЗЫ: да кстати, в таком виде индикаторы можно переносить из МТ4 в МТ5, главное индикаторные буферы настроить правильно, в МТ5 там жуть, что с индексацией массивов под буфера.... они просто массивы с обычной массивовской )))) индексацией.... раньше было тяжело к индексации индикаторных буферов привыкнуть в МТ4, теперь наоборот отвыкнуть невозможно и перейти на МТ5 ))))
Это не Ваш код. Публиковал кто то из коллег, но кто и где, я не могу вспомнить. Я этот код и имел в виду, когда написал, что в OnInit ничего не надо переносить, а не исходный. Не точно выразился.
А Вы какую конструкцию рекомендовали бы? Эта вроде бы проста предельно.
А, вот и автор фрагмента )))) Опередил меня.
//+------------------------------------------------------------------+//| Custom indicator iteration function |//+------------------------------------------------------------------+intOnCalculate(constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &spread[])
{
//--- Проверка количества доступных баров (1 - минимально, 4 - оптимально для большинства расчётов. Но всё "по месту"...)if(rates_total<4) return0;
//--- Проверка и расчёт количества просчитываемых баровint limit=rates_total-prev_calculated; // 0 - пришел новый тик, новый бар формироваться не начал. 1 - пришел новый тик и начал формироваться новый бар.if(limit>1)
// если вписать "limit>0", то на нулевом баре будет расчёт только нулевого бара, на каждом новом баре будет полный перерасчёт всей истории// если вписать "limit>1", то на нулевом баре будет расчёт только нулевого бара, на открытии нового бара - пересчёт первого и нулевого,// при подгрузке истории и на первом запуске - перерасчёт всей истории
{
limit=rates_total-1;
// здесь должна быть инициализация всех используемых буферов индикатора необходимыми значениями (обычно EMPTY_VALUE и 0)
}
//--- Расчёт индикатораfor(int i=limit; i>=0 && !IsStopped(); i--)
{
// необходимые действия по расчёту индикатора
}
//--- return value of prev_calculated for next callreturn(rates_total);
}
//+------------------------------------------------------------------+
ага, код шаблона индикатора чем хорош? запускаешь визард по созданию индикатора, выбираешь типы и цвет линий и если нужно добавляешь input 'ы
и все, индикатор готов, потом копируй из OnCalculate() шаблона тело и пиши расчеты,
свой первый индикатор можно написать за 1 минуту, выше код "Hello word I indicator!!!" - я показал :)
ЗЫ: да кстати, в таком виде индикаторы можно переносить из МТ4 в МТ5, главное индикаторные буферы настроить правильно, в МТ5 там жуть, что с индексацией массивов под буфера.... они просто массивы с обычной массивовской )))) индексацией.... раньше было тяжело к индексации индикаторных буферов привыкнуть в МТ4, теперь наоборот отвыкнуть невозможно и перейти на МТ5 ))))
Ничего сложного. Пример кроссплатформенного индикатора (использует класс), но шаблон можно выдернуть - убрать класс и всё лишнее, что ошибки после этого будет выдавать - останется кроссплатформенный шаблон.
Этот индикатор будет одинаково работать на обеих платформах без изменения - лишь компиляция с нужным расширением. Пришлось код разбить на две части - класс и сам индикатор (всё было в одном листинге)
Как создать массив экземпляров класса?
Сделал ClassName* className[], потом на него ArrayResize, но не дает доступ к методам invalid pointer access
Ваш класс, экземпляры которого хотите в массив собирать, должен быть наследован от CObject.
А далее всё просто: создаёте список (массив) объектов CArrayObj, и в него добавляете свои объекты.
По словам "шаблон индикатора" и вашему имени поиск ничего не находит, а написали здесь уже на том Войны и мира.
Какое-нибудь сочетание слов из поста припомните.
Ну, прошу прощения, про шаблон индикатора может быть я попутал - шаблон трала выкладывал.
Давайте так: создайте в редакторе шаблон индикатора, при создании добавьте нужное количество входных переменных и рисуемых буферов.
Далее разберём что нужно делать из конкретной задачи.
Вы если говорите что плохо, скажите как сделать хорошо. Перенести вычисления в OnInit?
Справедливый упрек )) Вот, вариант кода, который был опубликован здесь:
Попробуйте так делать. А в OnInit ничего переносить не надо.
Справедливый упрек )) Вот, вариант кода, который был опубликован здесь:
Попробуйте так делать. А в OnInit ничего переносить не надо.
Я такой код не публиковал здесь - не моё :)
Использую иные конструкции - проще и понятнее.
В OnInit() нужно переносить. Зачем на каждом тике назначать массив индикаторному буферу?
Я такой код не публиковал здесь - не моё :)
Использую иные конструкции - проще и понятнее.
это мое, куда же проще? ))) (по крайней мере у меня тоже в шаблоне есть комментарий limit = rates_total - 1; //--- Первый вызов индикатора или смена таймфрейма или подгрузка данных из истории) и мой стиль форматирования одна фигурная скобка около for() {
ну а по сабжу, чтобы научиться написать свой индикатор, берем шаблон указанный выше и добавляем хотя бы цену закрытия и получаем свой первый индикатор, потом учимся от этой цены закрытия делать МАшку
Я такой код не публиковал здесь - не моё :)
Использую иные конструкции - проще и понятнее.
В OnInit() нужно переносить. Зачем на каждом тике назначать массив индикаторному буферу?
Это не Ваш код. Публиковал кто то из коллег, но кто и где, я не могу вспомнить. Я этот код и имел в виду, когда написал, что в OnInit ничего не надо переносить, а не исходный. Не точно выразился.
А Вы какую конструкцию рекомендовали бы? Эта вроде бы проста предельно.
А, вот и автор фрагмента )))) Опередил меня. Кстати, я тоже такой стиль форматирования использую - с одной открывающейся фигурной скобкой в строке.А, вот и автор фрагмента )))) Опередил меня. Кстати, я тоже такой стиль форматирования использую - с одной открывающейся фигурной скобкой в строке.
ага, код шаблона индикатора чем хорош? запускаешь визард по созданию индикатора, выбираешь типы и цвет линий и если нужно добавляешь input 'ы
и все, индикатор готов, потом копируй из OnCalculate() шаблона тело и пиши расчеты,
свой первый индикатор можно написать за 1 минуту, выше код "Hello word I indicator!!!" - я показал :)
ЗЫ: да кстати, в таком виде индикаторы можно переносить из МТ4 в МТ5, главное индикаторные буферы настроить правильно, в МТ5 там жуть, что с индексацией массивов под буфера.... они просто массивы с обычной массивовской )))) индексацией.... раньше было тяжело к индексации индикаторных буферов привыкнуть в МТ4, теперь наоборот отвыкнуть невозможно и перейти на МТ5 ))))Это не Ваш код. Публиковал кто то из коллег, но кто и где, я не могу вспомнить. Я этот код и имел в виду, когда написал, что в OnInit ничего не надо переносить, а не исходный. Не точно выразился.
А Вы какую конструкцию рекомендовали бы? Эта вроде бы проста предельно.
А, вот и автор фрагмента )))) Опередил меня.ага, код шаблона индикатора чем хорош? запускаешь визард по созданию индикатора, выбираешь типы и цвет линий и если нужно добавляешь input 'ы
и все, индикатор готов, потом копируй из OnCalculate() шаблона тело и пиши расчеты,
свой первый индикатор можно написать за 1 минуту, выше код "Hello word I indicator!!!" - я показал :)
ЗЫ: да кстати, в таком виде индикаторы можно переносить из МТ4 в МТ5, главное индикаторные буферы настроить правильно, в МТ5 там жуть, что с индексацией массивов под буфера.... они просто массивы с обычной массивовской )))) индексацией.... раньше было тяжело к индексации индикаторных буферов привыкнуть в МТ4, теперь наоборот отвыкнуть невозможно и перейти на МТ5 ))))Ничего сложного. Пример кроссплатформенного индикатора (использует класс), но шаблон можно выдернуть - убрать класс и всё лишнее, что ошибки после этого будет выдавать - останется кроссплатформенный шаблон.
Этот индикатор будет одинаково работать на обеих платформах без изменения - лишь компиляция с нужным расширением. Пришлось код разбить на две части - класс и сам индикатор (всё было в одном листинге)
Класс:
Индикатор: