Этот скрипт разработан для генерации волн с кумулятивным объемом в соответствии с заданными условиями. На последних барах бывают случаи, когда условия не определяют, какая волна формируется вверх или вниз. Это принимается как факт, и мы соглашаемся ждать формирования следующих баров. После того, как новые бары определяют направление волны, следует добавить предыдущие бары в качестве начала этой новой волны. Предполагалось, что выполнение условий формирования волны будет сохраняться в одном ряду и вноситься поправки при переносе в другой ряд. Можно ли исправить написанный код или сделать реализацию другим методом, например, через массивы или офсет?
Я переработал скрипт для использования массивов. Еще несколько уточнений по алгоритму. Строится временной ряд «-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)
[ОБНОВЛЯТЬ]
Альтернативное описание вопроса.
Есть условия, которые создают серию wavetemp
значений «-1», «0» и «1».
Из серии wavetemp
создайте новую серию wave
по правилам:
а. если значение ряда wavetemp
равно «-1» или «1», то ему присваивается новый ряд wave
;
б. если значение ряда wavetemp
равно «0», то дождитесь, пока ряд значения станет равным «-1» или «1», весь недостающий элемент нового ряда wave
выдается на первое ненулевое значение
@BjornMistiaen, большое спасибо за интерес к моей проблеме. Постараюсь переформулировать свой вопрос, чтобы было понятнее. Пожалуйста, извините меня за использование переводчика Google.
Не беспокойся. Просто не забудьте оставить комментарий, когда закончите изменять вопрос, чтобы я получил уведомление.
@BjornMistiaen, посмотрите обновление вопроса, спасибо.
Это невозможно сделать в Pine. Вы не можете изменить исторические точки данных ряда. Объяснение здесь. Вы сможете создать массив, содержащий точки данных, как на картинке, но вы не сможете отображать их на bar_index в прошлом.
@BjornMistiaen, поэтому я пытаюсь рисовать с помощью функций line.
, но мне не хватает настройки ширины линии автомасштабирования.
Вы не можете автоматически масштабировать ширину линии. Вы должны использовать plot
с style=plot.style_columns
. Это идеальное решение. Я не знаю, почему вы хотите использовать линии для того, что вы делаете.
Получилось сделать работающий скрипт за счет использования смещения. С точки зрения программирования это ужасно, но других идей у меня нет. Моя идея состоит в том, что последние бары имеют разные сюжеты для каждого отдельного бара.
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)
Этот скрипт отлично работает имхо. Смотрите скриншот. Мне непонятно, в чем проблема.