Построение ручных уровней для дневного максимума, минимума, закрытия - PullRequest
0 голосов
/ 19 апреля 2020

Поскольку я уже задал пару вопросов здесь, пытаясь решить мою проблему, этот новый вопрос связывает их все вместе и предоставляет некоторый контекст.
Предыдущие вопросы, связанные с этим:

У меня есть программа (за пределами 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)

Проблема здесь в том, что он отображает только значения для последней даты.

enter image description here

1 Ответ

1 голос
/ 20 апреля 2020

Это должно масштабироваться. Просто PO C это с множеством строк, чтобы быть уверенным:

//@version=4
study("HLC Levels", "", true)

initOnDate(_y, _m, _d, _prev, _init) => 
    if _y == year and _m == month and _d == dayofmonth
        _init
    else
        _prev

float h = na
float l = na
float c = na
int   y = 0
int   m = 0
int   d = 0

y := 2020, m := 03, d := 31, h := initOnDate(y, m, d, h, 2600), l := initOnDate(y, m, d, l, 2500), c := initOnDate(y, m, d, c, 2525)
y := 2020, m := 04, d := 01, h := initOnDate(y, m, d, h, 2610), l := initOnDate(y, m, d, l, 2510), c := initOnDate(y, m, d, c, 2535)
y := 2020, m := 04, d := 02, h := initOnDate(y, m, d, h, 2620), l := initOnDate(y, m, d, l, 2520), c := initOnDate(y, m, d, c, 2545)

plot(h, "h", change(h) ? na : color.green,  1)
plot(l, "l", change(l) ? na : color.red,    1)
plot(c, "c", change(c) ? na : color.orange, 1)

enter image description here

...