Skip to content

Instantly share code, notes, and snippets.

@DBoyara
Last active February 20, 2024 11:35
Show Gist options
  • Select an option

  • Save DBoyara/6b06509b6e2256da9019da5cbb362b58 to your computer and use it in GitHub Desktop.

Select an option

Save DBoyara/6b06509b6e2256da9019da5cbb362b58 to your computer and use it in GitHub Desktop.
True ADX indicator like in QUIK
import numpy as np
def adx(high, low, close, window=14):
"""Функция для вычисления Average Directional Index (ADX)
Аргументы:
high: Список или массив значений High цен
low: Список или массив значений Low цен
close: Список или массив значений Close цен
window: Период для вычисления ADX (по умолчанию 14)
Возвращает:
ADX: Значение Average Directional Index
"""
m_plus = high - np.roll(high, 1)
m_minus = np.roll(low, 1) - low
dm_plus = np.where(m_plus > m_minus, np.maximum(m_plus, 0), 0)
dm_minus = np.where(m_minus > m_plus, np.maximum(m_minus, 0), 0)
tr = tr(high, low, close)
di_plus = ema(dm_plus / tr, window)
di_minus = ema(dm_minus / tr, window)
dx = np.abs(di_plus - di_minus) / (di_plus + di_minus)
adx = ema(dx, window) * 100
return adx
def tr(high, low, close):
"""Вычисление истинного диапазона (True Range) для каждого периода
Аргументы:
high: Список или массив значений High цен
low: Список или массив значений Low цен
close: Список или массив значений Close цен
"""
true_ranges = []
for i in range(len(high)):
if i == 0:
true_range = high[i] - low[i]
else:
true_range = max(high[i], close[i - 1]) - min(low[i], close[i - 1])
if true_range == 0:
true_range = 0.00000001
true_ranges.append(true_range)
return true_ranges
def ema(values, window):
"""
Функция для вычисления экспоненциальной взвешенной скользящей средней
Аргументы:
values: Список или массив значений
window: Период для вычисления EMA
Возвращает:
ema: Значение экспоненциальной взвешенной скользящей средней
"""
alpha = 2 / (window + 1)
ema = np.zeros(len(values))
ema[0] = values[0]
for i in range(1, len(values)):
ema[i] = alpha * values[i] + (1 - alpha) * ema[i - 1]
return ema
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment