Я пробовал написать осциллятор , который возвращает ранг каждого заданного значения в процентах в пределах значений закрытия во временном диапазоне с использованием " percentrank " function.
Аналогичным образом , я попытался получить процентиль каждого значения закрытия в процентах в пределах значений закрытия во временном диапазоне используя комбинацию функций "наивысший" и "наименьший" .
Проблема заключается в том, что необходимая функция вызывает "процентный ранг", " наивысший "и" самый низкий " для достижения этих целей все принимают только простые целочисленные значения для параметра длины (который представляет собой количество столбцов, которые должны быть включены в расчет) в качестве входных данных.
Поскольку это количество баров является переменной в зависимости от включенного периода времени (в приведенном ниже примере кода: один год, но может быть гибким ), разрешение графика, торговая точка rs базового актива, отклоняющиеся торговые часы и торговые дни в праздничные дни , а также возможное включение расширенных торговых часов , это количество баров необходимо рассчитать путем определения первого бара в указанном временном диапазоне , который должен быть включен.
К сожалению, существующие функции, такие как «barssince» , которые могут быть использованы для поиска первого бара, удовлетворяющего критерии, возвращают целое число (не простое целое число) как результат, поэтому не может использоваться в качестве входных данных для первоначально упомянутых функций.
Вот почему я попытался исправить это с созданием структуры for-l oop в исследовании приведенного ниже примера кода, который возвращает количество баров в указанном временном диапазоне в виде простого целое число и, следовательно, может использоваться как ввод для ранее упомянутых функций.
Хотя необходимый индекс бара рассчитывается правильно ctly , как видно из результатов графика, , как только переменная, хранящая индекс столбца, будет использоваться в качестве входного параметра для ранее упомянутых функций «процент ранг», «наивысший "и" самый низкий ", кажется, что значение отображается в этих функциях как 1 .
Может ли кто-нибудь объяснить такое поведение или это ошибка в скрипте Pine?
Есть ли другой обходной путь для получения процентного ранга, а также самого высокого и самого низкого значений для указанного c гибко определяемого временного интервала, неизвестного во время компиляции?
study("Test Rank in Range and Percentile in Range")
ci_millisecondsOneYear = 1000 * 60 * 60 * 24 * 365 // Define number of ms in a year
i_millisecondsStartTimeIncludedPeriod = time - ci_millisecondsOneYear // Start time of included range
var int vi_indexFirstBarIncludedPeriod = 0 // Track bar index of first bar within time of included range
// Find bar index of first bar within time of included range
for i = vi_indexFirstBarIncludedPeriod to 0
if time[i] > i_millisecondsStartTimeIncludedPeriod
break
vi_indexFirstBarIncludedPeriod := vi_indexFirstBarIncludedPeriod -1
// Calculate Percentrank
sf_rankValuePercent = percentrank(close, max(vi_indexFirstBarIncludedPeriod, 1)) // First bar tracker is 0 in first iteration
// Increment reference counter for first bar of range within included range
// to keep up with incremented reference in next iteration
vi_indexFirstBarIncludedPeriod := vi_indexFirstBarIncludedPeriod + 1
// Calculate Percentile of included range
sf_valueIncludedPeriodHighest = highest(close, vi_indexFirstBarIncludedPeriod)
sf_valueIncludedPeriodLowest = lowest(close, vi_indexFirstBarIncludedPeriod)
sf_percentileValue = ((close - sf_valueIncludedPeriodLowest) / (sf_valueIncludedPeriodHighest - sf_valueIncludedPeriodLowest)) * 100
// Plots to assess results and calculations
plot(sf_rankValuePercent, "Percentrank", color.blue)
plot(vi_indexFirstBarIncludedPeriod, "Number of Included Last Bars", color.red)
plot(sf_valueIncludedPeriodHighest, "Highest Value of included Bars", color.yellow)
plot(sf_valueIncludedPeriodLowest, "Lowest Value of included Bars", color.gray)
plot(sf_percentileValue, "Percentile of Range", color.navy)
plot(year(i_millisecondsStartTimeIncludedPeriod), "Year", color.green)
plot(month(i_millisecondsStartTimeIncludedPeriod), "Month", color.orange)
plot(dayofmonth(i_millisecondsStartTimeIncludedPeriod), "Day", color.purple)
Снимок экрана с нанесенными на график значениями
Настройки для значений на графике
Процентный рейтинг только для двух столбцов