Как присвоить значение бару?, Это можно реализовать в скрипте или обязательно делать через написание индикатора?
Пользователь
Сообщений: Регистрация: 20.10.2016
26.07.2018 14:00:08
Необходимо при выполнении нескольких условий произвести расчет и присвоить результат конкретной свече так, чтобы потом обращаясь к номеру свечи эту информацию получить. Это можно реализовать в скрипте или обязательно делать через написание индикатора?
Пользователь
Сообщений: Регистрация: 19.07.2018
26.07.2018 17:28:10
Создать в скрипте таблицу candleInfo = {}, записывать туда время бара и своё расчётное значение table.insert(candleInfo, {currentCandle["datetime"] ,calcValue}), ну а потом сделать функцию для поиска по таблице. Перебирать бары, брать их datetime и через SearchItems искать в таблице candleInfo. зы. На практике не проверял, но вроде как годный алгоритм и без всяких индикаторов
Пользователь
Сообщений: Регистрация: 20.10.2016
26.07.2018 20:10:11
Цитата
Александр написал: Создать в скрипте таблицу candleInfo = {}, записывать туда время бара и своё расчётное значение table.insert(candleInfo, {currentCandle["datetime"] ,calcValue}), ну а потом сделать функцию для поиска по таблице. Перебирать бары, брать их datetime и через SearchItems искать в таблице candleInfo. зы. На практике не проверял, но вроде как годный алгоритм и без всяких индикаторов
Смысл понятен. Начинаю лепить)) Спасибо за совет.
Пользователь
Сообщений: Регистрация: 20.10.2016
29.07.2018 10:56:57
Поступил следующим образом: При выполнении ряда условий производится расчет который записывается в массив. Ключом является время бара в формате posix. Array3Min[os.time(t[N-2].datetime)] = KF По этому ключу, т.е. по времени бара легко достаю нужный мне, ранее сохраненный расчет. Подскажите каким образом удалять все данные из массива (это я буду делать ежедневно по времени). Как удалить первый элемент? Я так понимаю, что table.remove(Array3Min, 1) здесь не прокатит?
Пользователь
Сообщений: Регистрация: 10.04.2015
30.07.2018 03:55:13
Цитата
sav 312 написал: Array3Min[os.time(t[N-2].datetime)] = KF Как удалить первый элемент? Я так понимаю, что table.remove(Array3Min, 1) здесь не прокатит?
Присвоить ему значение nil: Array3Min[os.time(t[N-2].datetime)] = nil
Пользователь
Сообщений: Регистрация: 20.10.2016
30.07.2018 09:39:54
Цитата
Suntor написал: Присвоить ему значение nil: Array3Min[os.time(t[N-2].datetime)] = nil
Спасибо. А как удалить первое значение? Дело в том, что ключом каждого значения, в моем случае, является время бара в секундах, т.е. данные идут не строго одни за другими (как например Array3Min[1] = KF, потом Array3Min[2] = KF и т.д.).
Пользователь
Сообщений: Регистрация: 20.10.2016
30.07.2018 09:42:02
Возможно я не правильно объяснил задачу... Мне нужно удалить именно первую ячейку не ссылаясь на ее ключ.
Пользователь
Сообщений: Регистрация: 10.04.2015
30.07.2018 12:02:40
Цитата
sav 312 написал: Мне нужно удалить именно первую ячейку не ссылаясь на ее ключ.
Первая ячейка есть только для индексированных таблиц, то-есть для массивов. Для них же работают ф-ции table.insert и table.remove, которые понимают этот индекс, и умеют сдвигать остальные элементы таблицы при вставке и удалении элемента, что занимает время и ресурсы, особенно для больших таблиц. Поэтому сама идея, удалить первый элемент таблицы, а потом ждать, пока вся таблица перестроится, не слишком удачная, где она не является самоцелью... так сказать. Когда же вы присваиваете nil, элементу таблицы, то вне зависимости от того, индексная эта таблица или нет, никакого перестроения таблицы не происходит.
Поскольку в качестве ключа вы используете number возвращаемый ф-цией os.time, то ваша таблица индексная, но начинается не с первого элемента, а с 1,5 млрд.-ого... поэтому, особого смысла удалять 1,5 млрд.-ый элемент через table.remove, чтобы 1,5 млрд.+1 элемент и все остальные сдвинулись на его место нет. Заведите переменные хранящие начало и конец вашего массива, и сдвигайте их вперёд по мере удаления старых через nil сначала таблицы и добавления новых к концу вашей таблицы.
Пользователь
Сообщений: Регистрация: 20.10.2016
30.07.2018 12:26:37
Цитата
Suntor написал: Первая ячейка есть только для индексированных таблиц, то-есть для массивов. Для них же работают ф-ции table.insert и table.remove, которые понимают этот индекс, и умеют сдвигать остальные элементы таблицы при вставке и удалении элемента, что занимает время и ресурсы, особенно для больших таблиц. Поэтому сама идея, удалить первый элемент таблицы, а потом ждать, пока вся таблица перестроится, не слишком удачная, где она не является самоцелью... так сказать. Когда же вы присваиваете nil, элементу таблицы, то вне зависимости от того, индексная эта таблица или нет, никакого перестроения таблицы не происходит.
Поскольку в качестве ключа вы используете number возвращаемый ф-цией os.time, то ваша таблица индексная, но начинается не с первого элемента, а с 1,5 млрд.-ого... поэтому, особого смысла удалять 1,5 млрд.-ый элемент через table.remove, чтобы 1,5 млрд.+1 элемент и все остальные сдвинулись на его место нет. Заведите переменные хранящие начало и конец вашего массива, и сдвигайте их вперёд по мере удаления старых через nil сначала таблицы и добавления новых к концу вашей таблицы.
Мысль понятна. Не буду заморачиваться с удалением 1-го элемента. Поскольку данных за торговую сессию будет немного, буду обнулять массив в начале следующего дня. Всем спасибо за советы.
Пользователь
Сообщений: Регистрация: 10.04.2015
30.07.2018 12:32:09
Цитата
sav 312 написал: Мысль понятна. Не буду заморачиваться с удалением 1-го элемента. Поскольку данных за торговую сессию будет немного, буду обнулять массив в начале следующего дня. Всем спасибо за советы.
Оно и не получится логически. Если удалите индексный элемент, индекс которого время в секундах, то остальные элементы сдвинутся и поменяют свои индексы, а значит и время. Поэтому, последующие обращения по времени вернут данные не для тех свечей... собственно, поэтому, как я и написал в первом сообщении, просто присваивайте nil элементу таблицы с соответствующим индексом.
Пользователь
Сообщений: Регистрация: 20.10.2016
30.07.2018 12:40:21
Цитата
Suntor написал: Оно и не получится логически. Если удалите индексный элемент, индекс которого время в секундах, то остальные элементы сдвинутся и поменяют свои индексы, а значит и время. Поэтому, последующие обращения по времени вернут данные не для тех свечей... собственно, поэтому, как я и написал в первом сообщении, просто присваивайте nil элементу таблицы с соответствующим индексом.