Вопросы от "чайника" - страница 68

 

x100intraday:

1.  Основное, что меня интересует: возможно ли напрямую заполнять временнЫе буферы аналогично ценовым (не прибегая к CopyTime и прочим штатным функциям копирования в массив) и как, а если нет, то почему?

2.  Неужели для этой цели придётся заводить другую пару буферов под хранение секунд с начала 1970 года, но с типом не datetime, а каким-нибудь double или long, например, а в необходимые моменты конвертировать через TimeToString в формат времени как литеральной строки?

1.  Невозможно.  С "почему?" - к разработчикам.

2.  В вашем случае это самое простое решение. (гарантированно рабочее.)  Поскольку вы ставите вопрос относительно заполнения буферов аналогично ценовым.

     А на своём месте я бы постарался на алгоритмическом уровне избежать такого расточительства по отношению к памяти.  И ни в коем случае не стал создавать буферы с заполненностью полезными данными в 3%.

 
MetaDriver:

     А на своём месте я бы постарался на алгоритмическом уровне избежать такого расточительства по отношению к памяти.  И ни в коем случае не стал создавать буферы с заполненностью полезными данными в 3%.

 Ну а тут уже вступает в силу эдакий вопрос-пояснение: https://www.mql5.com/ru/forum/1111/page529#comment_101059 с как минимум одним вразумительным и небезынтересным ответом, причём совершенно противоположным. Интерес накаляется...
 
x100intraday:

да, бяда))

"Константы даты и времени..." и "...могут быть представлены в виде литеральной строки".

а могут и не быть представленны.. это для ввода/вывода данных в привычном виде дата/время.

К тому же увязать массивы данного типа с индикаторными буферами возможности не имеем (да и не нужно?), SetIndexBuffer к массивам этого типа данных применять по известным причинам не можем.

типу datetime ничто не мешает быть в индикаторном буфере(таки желательно).

И не увязываем.

а зря)

Компилируем получившийся код. Получаем предупреждение: "truncation of constant value" в отношении строк в else с =EMPTY_VALUE (печально удивляемся) и ошибку в Эксперт-отчёте терминала: "Array out of range" в отношении тех же строк (в конец огорчаемся). По-видимому, в тип datetime EMPTY_VALUE помещаться не хочет, размер такого массива остаётся нулевым. Меняем EMPTY_VALUE на 0, ошибка исчезает, однако размер массива по-прежнему остаётся нулевым.

EMPTY_VALUE оно типа double.

С индикаторным буфером будет проще - не нужно размер массива определять.

Странно ещё и другое: размер буферов ExtUpperBuffer и ExtLowerBuffer ненулевой, значит, они всё-таки заполняются, но фракталы не появляются. С чего это вдруг?

эт, фиг его знает)

 Основное, что меня интересует: возможно ли напрямую заполнять временнЫе буферы аналогично ценовым (не прибегая к CopyTime и прочим штатным функциям копирования в массив) и как, а если нет, то почему? Неужели для этой цели придётся заводить другую пару буферов под хранение секунд с начала 1970 года, но с типом не datetime, а каким-нибудь double или long, например, а в необходимые моменты конвертировать через TimeToString в формат времени как литеральной строки?

доступ к данным типа datetime аналогичен доступу к ценовым данным.

дататайм, по сути, тот же инт/лонг.

 P.S.: кому лень воспроизводить у себя дополненный код Fractals.mq5, просто подскажите, как вы храните рассчитанные специфические временнЫе данные (без вызова хэндлов встроенных индикаторов и работы с ними)?

всё также, как и с целочисленными данными, int/datetime/long - одинаково.

 
Swan:

да, бяда))

типу datetime ничто не мешает быть в индикаторном буфере(таки желательно).

а зря)

С индикаторным буфером будет проще - не нужно размер массива определять.

 И что же конкретно я не так делаю? Ведь всё подробно расписал, исходник вообще штатный, проверенный временем, наипростейший! Модификации простые и очевидные... Теряюсь в догадках помутневшего рассудка... Меня когда клинит на чём-то, хоть автослесаря с разводным ключом вызывай...

 И каким же руническим заклинанием массивы типа datetime увязывать с индикаторными буферами? Повторюсь, что:


SetIndexBuffer

Связывает указанный индикаторный буфер с одномерным динамическим массивом типа double, объявленном на глобальном уровне.

 
x100intraday:

 И что же конкретно я не так делаю? Ведь всё подробно расписал, исходник вообще штатный, проверенный временем, наипростейший! Модификации простые и очевидные... Теряюсь в догадках помутневшего рассудка... Меня когда клинит на чём-то, хоть автослесаря с разводным ключом вызывай...

 И каким же руническим заклинанием массивы типа datetime увязывать с индикаторными буферами? Повторюсь, что:


SetIndexBuffer

Связывает указанный индикаторный буфер с одномерным динамическим массивом типа double, объявленном на глобальном уровне.

Далось вам это datetime. Пишите всё в double массив и перед использованием (если нужно) приводите к datetime.

По сути разница между datetime и double только в представлении. Время записанное в double можно без потерь конвертировать в datetime.

ЗЫ И тот у другой типы 8 байтовые.

 
x100intraday:

 И что же конкретно я не так делаю? Ведь всё подробно расписал, исходник вообще штатный, проверенный временем, наипростейший! Модификации простые и очевидные... Теряюсь в догадках помутневшего рассудка... Меня когда клинит на чём-то, хоть автослесаря с разводным ключом вызывай...

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

 И каким же руническим заклинанием массивы типа datetime увязывать с индикаторными буферами? Повторюсь, что:


SetIndexBuffer

Связывает указанный индикаторный буфер с одномерным динамическим массивом типа double, объявленном на глобальном уровне.

Urain уже ответил. нуу, чтоб компилятор не ругался, как-то так:

double ExtUpperTimeBuffer[];//обьявляем
...
ExtUpperTimeBuffer[xz0]=(double)time[xz1];//присваиваем
...
datetime XZ=(datetime)ExtUpperTimeBuffer[xz2];//юзаем
 

 Так-с... Ага...

 Вроде ничего принципиально нового, но зато почву под ногами утвердили, так сказать. 

 Всем спасибо за лекарственные пинки. Буду пробовать... 

 
x100intraday:

 Всем спасибо за лекарственные пинки.

И пинок Щастья в удачу : D
 

 Есть ли штатный аналог библиотечной функции array.Add()?

 P.S.: если нет, дайте годовой запас снотворного. 

 
x100intraday:

 Есть ли штатный аналог библиотечной функции array.Add()?

 P.S.: если нет, дайте годовой запас снотворного. 

Почему бы не хранить дату в индикат......орных буфер......ах типа double 

Много точек добавил, а то какая та ссылка появляется.

double time[10];

time[0] = (double) D'3000.12.31 23:59';
time[1] = (double) D'2030.12.31 23:59';

Print(TimeToString((datetime)time[0]));
Print(TimeToString((datetime)time[1]));

Все корректно преобразуется без ошибок 

Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
  • www.mql5.com
Основы языка / Типы данных / Вещественные типы (double, float) - Документация по MQL5