Проблемы, возникающие при переводе Pine Script на Python ⇐ Python
-
Гость
Проблемы, возникающие при переводе Pine Script на Python
У меня есть функция pine для расчета VMA, но когда я перевел ее в Python, результат отличается от результата Pine.
Например, результат Python — 1648,972734, а результат Pine — 1651,33.
Пример данных находится в https://gist.github.com/DNLINYJ/b06047b ... 87d6deb1de
Код VMA соснового сценария:
vma(len) => источник = закрыть к = 1,0/лен pdm = math.max((закрыть - закрыть[1]), 0) mdm = math.max((закрыть[1] - закрыть), 0) вар pdmS = float (на) pdmS := (1 - k) * nz(pdmS[1]) + k * pdm вар mdmS = float (на) mdmS := (1 - k) * nz(mdmS[1]) + k * mdm s = пдмС + мдмС pdi = pdmS/с мди = мдмС/с pdiS = число с плавающей запятой (на) pdiS := (1 - k) * nz(pdiS[1]) + k * pdi mdiS = с плавающей запятой (на) mdiS := (1 - k) * nz(mdiS[1]) + k * mdi d = math.abs(pdiS - mdiS) s1 = pdiS + mdiS вар iS = число с плавающей запятой (на) iS := (1 - k) * nz(iS[1]) + k * d / s1 hhv = ta.highest(iS, len) llv = ta.lowest(iS, len) d1 = hhv - llv vI = (iS - llv)/d1 вар vma = float (на) vma := (1 - k*vi)*nz(vma[1]) + k*vi*src вма Код VMA сценария Python:
def Calculate_vma(df, длина): df['pdm'] = np.where(df['Close'].diff(1) > 0, df['Close'].diff(1), 0) df['mdm'] = np.where(-df['Close'].diff(1) > 0, -df['Close'].diff(1), 0) df['pdmS'] = df['pdm'].ewm(span=длина, настройка=False).mean() df['mdmS'] = df['mdm'].ewm(span=длина, настройка=False).mean() df['s'] = df['pdmS'] + df['mdmS'] df['pdi'] = df['pdmS'] / df['s'] df['mdi'] = df['mdmS'] / df['s'] df['pdiS'] = df['pdi'].ewm(span=длина, настройка=False).mean() df['mdiS'] = df['mdi'].ewm(span=длина, настройка=False).mean() df['d'] = np.abs(df['pdiS'] - df['mdiS']) df['s1'] = df['pdiS'] + df['mdiS'] df['iS'] = df['d'] / df['s1'] df['iS'] = df['iS'].ewm(span=длина, настройка=False).mean() df['hhv'] = df['iS'].rolling(длина).max() df['llv'] = df['iS'].rolling(длина).min() df['d1'] = df['hhv'] - df['llv'] df['vI'] = (df['iS'] - df['llv']) / df['d1'] k = 1,0 / длина df = df.iloc[lenght:, :] # Удалить первые строки длиной len-1 vmas = [df['Close'].iat[0]] # Инициализируем значения vma для i в диапазоне (1, len(df)): vma = (1 - k * df['vI'].iat) * vmas + k * df['vI'].iat * df['Close'].iat[ я] vmas.append(vma) df['vma'] = vmas # Назначаем vma df возврат DF
У меня есть функция pine для расчета VMA, но когда я перевел ее в Python, результат отличается от результата Pine.
Например, результат Python — 1648,972734, а результат Pine — 1651,33.
Пример данных находится в https://gist.github.com/DNLINYJ/b06047b ... 87d6deb1de
Код VMA соснового сценария:
vma(len) => источник = закрыть к = 1,0/лен pdm = math.max((закрыть - закрыть[1]), 0) mdm = math.max((закрыть[1] - закрыть), 0) вар pdmS = float (на) pdmS := (1 - k) * nz(pdmS[1]) + k * pdm вар mdmS = float (на) mdmS := (1 - k) * nz(mdmS[1]) + k * mdm s = пдмС + мдмС pdi = pdmS/с мди = мдмС/с pdiS = число с плавающей запятой (на) pdiS := (1 - k) * nz(pdiS[1]) + k * pdi mdiS = с плавающей запятой (на) mdiS := (1 - k) * nz(mdiS[1]) + k * mdi d = math.abs(pdiS - mdiS) s1 = pdiS + mdiS вар iS = число с плавающей запятой (на) iS := (1 - k) * nz(iS[1]) + k * d / s1 hhv = ta.highest(iS, len) llv = ta.lowest(iS, len) d1 = hhv - llv vI = (iS - llv)/d1 вар vma = float (на) vma := (1 - k*vi)*nz(vma[1]) + k*vi*src вма Код VMA сценария Python:
def Calculate_vma(df, длина): df['pdm'] = np.where(df['Close'].diff(1) > 0, df['Close'].diff(1), 0) df['mdm'] = np.where(-df['Close'].diff(1) > 0, -df['Close'].diff(1), 0) df['pdmS'] = df['pdm'].ewm(span=длина, настройка=False).mean() df['mdmS'] = df['mdm'].ewm(span=длина, настройка=False).mean() df['s'] = df['pdmS'] + df['mdmS'] df['pdi'] = df['pdmS'] / df['s'] df['mdi'] = df['mdmS'] / df['s'] df['pdiS'] = df['pdi'].ewm(span=длина, настройка=False).mean() df['mdiS'] = df['mdi'].ewm(span=длина, настройка=False).mean() df['d'] = np.abs(df['pdiS'] - df['mdiS']) df['s1'] = df['pdiS'] + df['mdiS'] df['iS'] = df['d'] / df['s1'] df['iS'] = df['iS'].ewm(span=длина, настройка=False).mean() df['hhv'] = df['iS'].rolling(длина).max() df['llv'] = df['iS'].rolling(длина).min() df['d1'] = df['hhv'] - df['llv'] df['vI'] = (df['iS'] - df['llv']) / df['d1'] k = 1,0 / длина df = df.iloc[lenght:, :] # Удалить первые строки длиной len-1 vmas = [df['Close'].iat[0]] # Инициализируем значения vma для i в диапазоне (1, len(df)): vma = (1 - k * df['vI'].iat) * vmas + k * df['vI'].iat * df['Close'].iat[ я] vmas.append(vma) df['vma'] = vmas # Назначаем vma df возврат DF
Мобильная версия