Как Pine-скрипт рассчитывает RSI, используя 2 серии вместо 1 и точку?
У меня есть сосновый скрипт, который я пытаюсь преобразовать в python.
Тем не менее, сценарий Pine позволяет RSI иметь 2 серии в качестве входных данных вместо традиционных серий и периодов.
У меня вопрос, как это реализовано, я попробовал реализацию на их документации, но это не считается для второй серии:
pine_rsi(x, y) =>
u = max(x - x[1], 0) // upward change
d = max(x[1] - x, 0) // downward change
rs = rma(u, y) / rma(d, y)
res = 100 - 100 / (1 + rs)
res
Спасибо,
5 ответов
Я не эксперт в Python или что-то еще, но я думаю, что вы пытаетесь разделить на ноль.
Уравнение для RSI:
RSI= 100 - { 100 \ (1+RS) }
где
RS = SMMA(U,n) / SMMA(D,n)
Логика в вашем уравнении, по-видимому, не учитывает тот факт, что RS будет иметь ноль в знаменателе, если нисходящее значение rma равно нулю. Это условие возникает всякий раз, когда цена имеет тенденцию к снижению в течение 14 последовательных периодов или любого периода RSI.
Сценарий Pine Editor учитывает это, устанавливая RSI равным 100, когда возникает описанная выше ситуация.
В строке 6 ниже: RSI переключается на 100 всякий раз, когда член rma равен 0. Вторая часть строки выполняется только тогда, когда код не делится на ноль.
1 //@version=3
2 study(title="Relative Strength Index", shorttitle="RSI")
3 src = close, len = input(14, minval=1, title="Length")
4 up = rma(max(change(src), 0), len)
5 down = rma(-min(change(src), 0), len)
6 rsi = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down))
7 plot(rsi, color=purple)
8 band1 = hline(70)
9 band0 = hline(30)
10 fill(band1, band0, color=purple, transp=90)
Из документов соснового скрипта:
rsi(x,y)
"Если x - это ряд, а y - целое число, то x - исходный ряд, а y - длина.
"Если x - это ряд, а y - ряд, то x и y считаются двумя рассчитанными скользящими средними для изменений вверх и вниз"
Итак, если у вас есть как восходящие, так и нисходящие серии изменений, rsi
будет работать так:
u = ["your upward changes series"]
d = ["your downward changes series"]
rsi = 100 - 100 / (1 + u / d) //No need for a period value
для серий x и y
pine_rsi( x, y ) =>
res = 100 - 100 / (1 + x / y)
res
На самом деле в Pine Script есть такая вещь, как "вторая серия". Из документации:
rsi(x,y)
"If x is a series and y is integer then x is a source series and y is a length.
If x is a series and y is a series then x and y are considered to be 2 calculated MAs for upward and downward changes"
Однако это не объясняет, какова цель, так как в функцию rsi() не вводится длина - что Pine должен делать с данными?
Как и OP, я также хотел бы знать назначение 2-х серий в качестве входных данных для портирования на python. На это еще не ответили.
как это реализовано.. это не считается для второй серии:?
Нет такой вещи как " вторая " серия
Давайте рассмотрим код,
оригинал выглядит так:
pine_rsi( x, y ) =>
u = max(x - x[1], 0) // upward change
d = max(x[1] - x, 0) // downward change
rs = rma(u, y) / rma(d, y)
res = 100 - 100 / (1 + rs)
res
тем не менее, если мы расшифруем логику в более удобочитаемую форму, мы получим:
pine_rsi( aTimeSERIE, anRsiPERIOD ) =>
up = max( aTimeSERIE
- aTimeSERIE[1], 0 ) // upward changes
down = max( aTimeSERIE[1]
- aTimeSERIE, 0 ) // downward changes
rs = ( rma( up, anRsiPERIOD ) // RMA-"average" gains over period
/ rma( down, anRsiPERIOD ) // RMA-"average" losses over period
)
res = 100 - 100 / ( 1 + rs ) //
res
это именно то, что Дж. Уэллс Уайлдер назвал "Индекс относительной силы", не так ли?
Так что просто передайте правильные типы данных, как предписывает подпись вызова, и все готово.