Обновление значений или создание новой серии

Этот скрипт разработан для генерации волн с кумулятивным объемом в соответствии с заданными условиями. На последних барах бывают случаи, когда условия не определяют, какая волна формируется вверх или вниз. Это принимается как факт, и мы соглашаемся ждать формирования следующих баров. После того, как новые бары определяют направление волны, следует добавить предыдущие бары в качестве начала этой новой волны. Предполагалось, что выполнение условий формирования волны будет сохраняться в одном ряду и вноситься поправки при переносе в другой ряд. Можно ли исправить написанный код или сделать реализацию другим методом, например, через массивы или офсет?

Я переработал скрипт для использования массивов. Еще несколько уточнений по алгоритму. Строится временной ряд «-1», «0» и «1».

"-1" - волна ВНИЗ "0" - нейтральная волна "1" - волна ВВЕРХ.

На основе этого ряда создается массив, в котором все значения «0» заменяются первым ненулевым значением справа. Это должно работать! НО почему-то не работает.

study("Weis Wave Volume VSA", shorttitle = "WWV m1_v4 arr")

var wave = array.new_int(0)
//First main condition for up / down wave formation
CondUp1 = close[2] < close[0] and close[1] < close[0] ?  1 : 0
CondDn1 = close[2] > close[0] and close[1] > close[0] ? -1 : 0 
//Second additional condition for up / down wave formation
CondUp2 = open[1] <= close[0] and close[1] < close[0] ?  2 : 0
CondDn2 = open[1] >= close[0] and close[1] > close[0] ? -2 : 0
//Time series for a wave
wavetemp = 0
if CondUp1 != 0 and CondDn1 == 0
    wavetemp := 1 
if CondUp1 == 0 and CondDn1 != 0
    wavetemp := -1
if CondUp1 == 0 and CondDn1 == 0 and CondUp2 != 0 and CondDn2 == 0
    wavetemp := 1
if CondUp1 == 0 and CondDn1 == 0 and CondUp2 == 0 and CondDn2 != 0
    wavetemp := -1
//Array for wave
begin_index = int(na)
if nz(wavetemp[1]) == 0 and  nz(wavetemp[0]) != 0 
    begin_index := max(array.lastindexof(wave, 1), array.lastindexof(wave,-1))
    array.push(wave, wavetemp[0])
    for i = begin_index + 1 to bar_index - 1
        array.set(wave, i, wavetemp[0]) // New value for historic elements 
else 
    array.push(wave, wavetemp[0])

vol = float(na)
vol := bar_index == 0 ? nz(volume) : ( array.get(wave, bar_index - 1) == array.get(wave, bar_index) ? nz(vol[1]) + nz(volume) : nz(volume) )

up = float(na)
up := array.get(wave, bar_index) == 1 ? vol : na

pd = float(na)
pd := array.get(wave, bar_index) == 0 ? vol : na

dn = float(na)
dn := array.get(wave, bar_index) == -1 ? vol : na

plot(up, style=plot.style_columns, color=color.green)
plot(pd, style=plot.style_columns, color=color.black)
plot(dn, style=plot.style_columns, color=color.red)

[ОБНОВЛЯТЬ]

Альтернативное описание вопроса.

  1. Есть условия, которые создают серию wavetemp значений «-1», «0» и «1».

  2. Из серии wavetemp создайте новую серию wave по правилам:

А. если значение ряда wavetemp равно «-1» или «1», то ему присваивается новый ряд wave;

Б. если значение ряда wavetemp равно «0», то дождитесь, пока ряд значения станет равным «-1» или «1», весь недостающий элемент нового ряда wave выдается на первое ненулевое значение

Этот скрипт отлично работает имхо. Смотрите скриншот. Мне непонятно, в чем проблема.

Bjorn Mistiaen 10.01.2021 16:03

@BjornMistiaen, большое спасибо за интерес к моей проблеме. Постараюсь переформулировать свой вопрос, чтобы было понятнее. Пожалуйста, извините меня за использование переводчика Google.

AnyDozer 10.01.2021 17:42

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

Bjorn Mistiaen 10.01.2021 18:32

@BjornMistiaen, посмотрите обновление вопроса, спасибо.

AnyDozer 11.01.2021 05:45

Это невозможно сделать в Pine. Вы не можете изменить исторические точки данных ряда. Объяснение здесь. Вы сможете создать массив, содержащий точки данных, как на картинке, но вы не сможете отображать их на bar_index в прошлом.

Bjorn Mistiaen 11.01.2021 10:12

@BjornMistiaen, поэтому я пытаюсь рисовать с помощью функций line., но мне не хватает настройки ширины линии автомасштабирования.

AnyDozer 11.01.2021 10:39

Вы не можете автоматически масштабировать ширину линии. Вы должны использовать plot с style=plot.style_columns. Это идеальное решение. Я не знаю, почему вы хотите использовать линии для того, что вы делаете.

Bjorn Mistiaen 11.01.2021 12:01
Почему в Python есть оператор &quot;pass&quot;?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
7
212
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

plot(wave_vol,      style=plot.style_columns, editable=false, color=wave_col,      offset = -3)
plot(wave_vol_end2, style=plot.style_columns, editable=false, color=wave_col_end2, offset = -2, show_last = 1)
plot(wave_vol_end1, style=plot.style_columns, editable=false, color=wave_col_end1, offset = -1, show_last = 1)
plot(wave_vol_end0, style=plot.style_columns, editable=false, color=wave_col_end0, offset =  0, show_last = 1)

Другие вопросы по теме