Поскольку я уже задал пару вопросов здесь, пытаясь решить мою проблему, этот новый вопрос связывает их все вместе и предоставляет некоторый контекст.
Предыдущие вопросы, связанные с этим:
У меня есть программа (за пределами TradingView), которая пытается оценить уровни максимума / минимума / закрытия тикера SPX
на следующий торговый день.
Я планирую построить это только на внутридневных таймфреймах (что угодно) от 1 минуты до 4 часов).
Единственный тикер, на котором я собираюсь показать это, - SPX
.
Теперь я пытаюсь построить эти уровни в TradingView, чтобы получить наглядное представление о том, насколько точны предсказанные уровни.
Это означает, что у меня есть значение high/low/close
для каждого торгового дня.
Текущий набор данных содержит около 50 записей (т.е. 50 дней, когда у меня есть высокий / низкий / закрытый уровень для построения графика) и будет расти на 1 запись в каждый торговый день.
Таким образом, через 1 год набор данных будет содержать около 200 записей.
Поскольку набор данных больше, чем число рисованных объектов, которые могут быть отображены с помощью TradingView, я исключил использование таких рисованных объектов, как line.new()
.
Сборщик мусора вызовет только последний Будет показано около 50 нарисованных объектов, и я бы хотел, чтобы отображался полный набор данных.
Поэтому я думаю, что мне нужно прибегнуть к функции plot()
.
Это означает, что у меня будет 3 серии для построения графика: high
, low
и close
.
Каждый будет иметь различное значение для каждой торговой даты.
Так что, по сути, я я пытаюсь вручную создать эти 3 серии, присваивая им значение для каждой даты.
Но до сих пор мне не удалось выполнить sh.
Я также пытаюсь получить только 1 запись данных строка на торговую дату, чтобы избежать беспорядка и сохранить код чистым и обслуживаемым.
Поэтому я пытаюсь установить эти 3 точки данных на торговую дату только с одной функцией.
Приведенный ниже скрипт - моя последняя попытка с уменьшенным набором данных всего лишь 5 торговых дней для ясности.
Я знаю, что приведенный ниже скрипт неверен, поскольку переменная не может быть повторно использована.
Вот почему там написано line 19: 'h' is already defined
.
У меня нет обходного пути для этого, и я бы очень хотел его найти.
//@version=4
study("Study", overlay=true)
// Variables
var float dh = na
var float dl = na
var float dc = na
// Functions
isDate(y,m,d) => y==year and m==month and d==dayofmonth ? true:false
d(y,m,d,h,l,c) => // Daily Levels
if isDate(y,m,d)
[h,l,c]
else
[na,na,na]
// Set data for Daily High,Low,Close
[h,l,c] = d(2020,04,13,2800,2700,2725), dh:=h,dl:=l,dc:=c
[h,l,c] = d(2020,04,14,2850,2810,2825), dh:=h,dl:=l,dc:=c
[h,l,c] = d(2020,04,15,2800,2750,2710), dh:=h,dl:=l,dc:=c
[h,l,c] = d(2020,04,16,2850,2700,2790), dh:=h,dl:=l,dc:=c
[h,l,c] = d(2020,04,17,2900,2800,2850), dh:=h,dl:=l,dc:=c
// Plot Daily High,Low,Close
plot(dh, color=color.red)
plot(dl, color=color.green)
plot(dc, color=color.blue)
Другой попыткой является приведенный ниже код, который компилируется нормально.
//@version=4
study("Functions test", overlay=true)
var float h = na
var float l = na
var float c = na
isDate(y,m,d) => y==year and m==month and d==dayofmonth ? true:false
setData() =>
if isDate(2020,04,13)
[2800,2700,2725]
if isDate(2020,04,14)
[2850,2810,2825]
if isDate(2020,04,15)
[2800,2750,2710]
if isDate(2020,04,16)
[2850,2700,2790]
if isDate(2020,04,17)
[2900,2800,2850]
[h1,l1,c1] = setData()
h := h1
l := l1
c := c1
plot(h,color=color.red)
plot(l,color=color.green)
plot(c,color=color.blue)
Проблема здесь в том, что он отображает только значения для последней даты.