Как найти первый бар после гибко настраиваемой метки времени в Pine Script для Tradingview? - PullRequest
0 голосов
/ 13 июля 2020

Я пробовал написать осциллятор , который возвращает ранг каждого заданного значения в процентах в пределах значений закрытия во временном диапазоне с использованием " 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)

Снимок экрана с нанесенными на график значениями

Настройки для значений на графике

Процентный рейтинг только для двух столбцов

...