Crypto Python
807 subscribers
448 photos
26 files
455 links
Алготрейдинг 🤖 , работа с API бирж и агрегаторов 🌐 , автоматизации в крипто сфере📈 🚀
Ваши предложения📝 @binance_de
Download Telegram
📌 Dynamic Position Sizing Tool – Адаптивный объём позиции на основе ATR или Equity🧑‍💻

Суть идеи:🛠️

Dynamic Position Sizing — это подход, при котором размер позиции автоматически адаптируется под:🚀

- волатильность рынка (например, через ATR),

- или размер текущего капитала (equity).

Цель — поддерживать стабильный риск на сделку, независимо от условий.💸

import ccxt
import pandas as pd
import talib

# Настройки
exchange = ccxt.binance()
symbol = "BTC/USDT"
timeframe = "1h"
account_equity = 10000 # текущий капитал в USDT
risk_per_trade_pct = 0.01 # риск на сделку (1%)
atr_period = 14
lookback = 100

# Получение данных
ohlcv = exchange.fetch_ohlcv(symbol, timeframe=timeframe, limit=lookback)
df = pd.DataFrame(ohlcv, columns=["ts", "open", "high", "low", "close", "volume"])
atr = talib.ATR(df["high"], df["low"], df["close"], timeperiod=atr_period)

# Расчёт объёма позиции
risk_amount = account_equity * risk_per_trade_pct
atr_last = atr.iloc[-1]
position_size = risk_amount / atr_last # в USDT
entry_price = df["close"].iloc[-1]
qty = position_size / entry_price # в BTC

print(f"ATR: {atr_last:.2f} | Risk: {risk_amount} USDT")
print(f"Размер позиции: {qty:.6f} BTC (эквивалентно {position_size:.2f} USDT)")

#индикатор

📌 Подпишись  Crypto Python❗️
🔥9❤‍🔥2
📌 Detrended Price Oscillator (DPO) – Циклические сигналы без влияния тренда🧑‍💻

Суть индикатора:🚀

DPO (Detrended Price Oscillator) — осциллятор, созданный для выявления циклических колебаний цены, игнорируя долгосрочный тренд.

В отличие от большинства осцилляторов, DPO не используется для генерации сигналов тренда, а фокусируется на короткосрочной перекупленности/перепроданности.

import ccxt
import pandas as pd

# Настройки
exchange = ccxt.binance()
symbol = "BTC/USDT"
timeframe = "1h"
period = 14

# Загрузка исторических данных
ohlcv = exchange.fetch_ohlcv(symbol, timeframe=timeframe, limit=200)
df = pd.DataFrame(ohlcv, columns=["ts", "open", "high", "low", "close", "volume"])
df["ts"] = pd.to_datetime(df["ts"], unit="ms")

# Расчёт DPO
shift = int(period / 2 + 1)
df["sma"] = df["close"].rolling(window=period).mean()
df["dpo"] = df["close"].shift(shift) - df["sma"]

# Пример последних значений
print(df[["ts", "close", "dpo"]].tail(10))

#индикатор

📌 Подпишись  Crypto Python❗️
👍7❤‍🔥1🔥1
📌 Whale Wallet Tracking Strategy – Реакция на перемещения с крупных кошельков🧑‍💻

Суть стратегии:🚀

Крупные кошельки ("whales") часто принадлежат биржам, фондам, институционалам или ранним инвесторам.

Мониторинг их активности позволяет:

- Предугадывать возможную продажу или покупку,

- Реагировать на переводы на биржи (продажа) или с выводом с бирж (накопление),

- Использовать в стратегиях как фильтр или триггер.

Источники данных:💸

Whale Alert API

Glassnode – аналитика перемещений

Arkham Intelligence – адреса по именам

Onchain API (например, через etherscan, blockchair, bitquery, chainbase)
import requests
import time

API_KEY = "YOUR_WHALE_ALERT_API_KEY"
MIN_VALUE = 500000 # USD
INTERVAL = 60 # сек

def fetch_transfers():
url = "https://api.whale-alert.io/v1/transactions"
params = {
"api_key": API_KEY,
"min_value": MIN_VALUE,
"currency": "btc",
"limit": 10
}
r = requests.get(url, params=params)
data = r.json()
return data.get("transactions", [])

def parse_transfer(tx):
direction = "→ EXCHANGE" if tx["to"]["owner_type"] == "exchange" else "← FROM EXCHANGE"
print(f"[{tx['timestamp']}] {tx['amount']} BTC {direction} | From: {tx['from']['owner']} → {tx['to']['owner']}")

if __name__ == "__main__":
while True:
txs = fetch_transfers()
for tx in txs:
parse_transfer(tx)
time.sleep(INTERVAL)

#индикатор

📌 Подпишись  Crypto Python❗️
👍8🔥4👏2❤‍🔥1
📌 Volatility Regime Classifier – Классификация рынка на флет и тренд🧑‍💻

Суть идеи:🚀

Рынок постоянно переходит между двумя основными режимами:

Тренд — направленное движение (вверх или вниз),

Флет — боковик, консолидация, низкая волатильность.

Цель стратегии:🛠️
автоматически определить текущий режим рынка, чтобы:

- применять подходящую стратегию (например, трендовая/флетовая),

- фильтровать ложные сигналы,

- управлять рисками.
import ccxt
import pandas as pd
import talib

# Параметры
exchange = ccxt.binance()
symbol = "BTC/USDT"
timeframe = "1h"
atr_period = 14
lookback = 150
volatility_threshold = 100 # например, 100 USDT по BTC

# Получение данных
ohlcv = exchange.fetch_ohlcv(symbol, timeframe=timeframe, limit=lookback)
df = pd.DataFrame(ohlcv, columns=["ts", "open", "high", "low", "close", "volume"])
df["ts"] = pd.to_datetime(df["ts"], unit="ms")

# Расчёт ATR (волатильности)
df["atr"] = talib.ATR(df["high"], df["low"], df["close"], timeperiod=atr_period)

# Классификация режима
df["regime"] = "flat"
df.loc[df["atr"] > volatility_threshold, "regime"] = "trend"

# Последнее состояние
last = df.iloc[-1]
print(f"Последний режим рынка: {last['regime'].upper()} (ATR = {last['atr']:.2f})")

#индикатор

📌 Подпишись  Crypto Python❗️
👍7🔥4❤‍🔥1
📌 Ehler’s Fisher Transform – Определение экстремумов через нормализацию🧑‍💻

Суть индикатора:🛠️

Fisher Transform от Джона Эйлерса — это математическая трансформация, которая переводит данные в псевдо-нормальное распределение, усиливая крайние значения (экстремумы).
Он помогает точнее выявлять разворотные точки, особенно в сочетании с другими осцилляторами.

Типовые сигналы:💸

- Пересечение нуля: возможный разворот

- Выход за уровни ±1.5 или ±2: перекупленность/перепроданность

import ccxt
import pandas as pd
import numpy as np

# Получение данных
exchange = ccxt.binance()
symbol = "BTC/USDT"
tf = "1h"
limit = 300

ohlcv = exchange.fetch_ohlcv(symbol, timeframe=tf, limit=limit)
df = pd.DataFrame(ohlcv, columns=["ts", "open", "high", "low", "close", "volume"])
df["ts"] = pd.to_datetime(df["ts"], unit="ms")

# Fisher Transform
length = 10
price = (df["high"] + df["low"]) / 2
min_low = price.rolling(length).min()
max_high = price.rolling(length).max()
value = 2 * ((price - min_low) / (max_high - min_low + 1e-9) - 0.5)

# Ограничим значения от -0.999 до 0.999
value = value.clip(-0.999, 0.999)

# Применим трансформацию
fisher = 0.5 * np.log((1 + value) / (1 - value))
df["fisher"] = fisher.rolling(3).mean()

# Последние значения
print(df[["ts", "close", "fisher"]].tail(10))

#индикатор

📌 Подпишись  Crypto Python❗️
👍7🔥3
📌 Fractal Adaptive Moving Average (FRAMA) – Адаптивная скользящая средняя на фрактальной основе🧑‍💻

Суть индикатора:🛠️

FRAMA — это усовершенствованная скользящая средняя, предложенная Джоном Эйлерсом, которая:

- адаптируется к рыночной волатильности,

- становится гладкой во флете и быстрой в тренде,

- основана на оценке фрактальной размерности цены (измерение "неровности").
import ccxt
import pandas as pd
import numpy as np

# Настройки
symbol = "BTC/USDT"
timeframe = "1h"
n = 16 # длина окна FRAMA
w = 5 # размер сегмента внутри окна

exchange = ccxt.binance()
ohlcv = exchange.fetch_ohlcv(symbol, timeframe=timeframe, limit=300)
df = pd.DataFrame(ohlcv, columns=["ts", "open", "high", "low", "close", "volume"])
df["ts"] = pd.to_datetime(df["ts"], unit="ms")

def frama(close, n=16, w=5):
alpha_min = 0.01
alpha_max = 1.0
frama = [close[0]]

for i in range(1, len(close)):
if i < n:
frama.append(close[i])
continue

hl = close[i - n + 1:i + 1]
hl1 = close[i - n + 1:i - n//2 + 1]
hl2 = close[i - n//2 + 1:i + 1]

n1 = (hl1.max() - hl1.min()) / (n // 2)
n2 = (hl2.max() - hl2.min()) / (n // 2)
n3 = (hl.max() - hl.min()) / n

if n1 > 0 and n2 > 0 and n3 > 0:
D = (np.log(n1 + n2) - np.log(n3)) / np.log(2)
alpha = np.exp(-4.6 * (D - 1))
alpha = min(max(alpha, alpha_min), alpha_max)
else:
alpha = alpha_min

frama_val = alpha * close[i] + (1 - alpha) * frama[-1]
frama.append(frama_val)

return pd.Series(frama, index=close.index)

# Применение
df["frama"] = frama(df["close"])

# Вывод последних значений
print(df[["ts", "close", "frama"]].tail(10))

#индикатор

📌 Подпишись  Crypto Python❗️
👍6🔥4
📌 Hull Moving Average Crossover – Cтратегия пересечения HMA🧑‍💻

Суть индикатора:🚀

Hull Moving Average (HMA) — это гладкая и быстро реагирующая скользящая средняя, разработанная Аланом Халлом.
Она снижает запаздывание обычных MA (например, EMA) и при этом остаётся плавной.

Пересечение двух HMA с разными периодами может использоваться как сигнал к входу или выходу.

Сигналы стратегии:🛠️

- Buy: HMA_fast пересекает HMA_slow снизу вверх

- Sell: HMA_fast пересекает HMA_slow сверху вниз

import ccxt
import pandas as pd
import numpy as np

def wma(series, period):
weights = np.arange(1, period + 1)
return series.rolling(period).apply(lambda prices: np.dot(prices, weights)/weights.sum(), raw=True)

def hma(series, period):
half = int(period / 2)
sqrt_p = int(np.sqrt(period))

wma_half = wma(series, half)
wma_full = wma(series, period)
raw = 2 * wma_half - wma_full
return wma(raw, sqrt_p)

# Данные с Binance
exchange = ccxt.binance()
symbol = "BTC/USDT"
tf = "1h"
ohlcv = exchange.fetch_ohlcv(symbol, timeframe=tf, limit=200)
df = pd.DataFrame(ohlcv, columns=["ts", "open", "high", "low", "close", "volume"])
df["ts"] = pd.to_datetime(df["ts"], unit="ms")

# HMA
df["hma_fast"] = hma(df["close"], 14)
df["hma_slow"] = hma(df["close"], 55)

# Сигналы пересечения
df["signal"] = 0
df.loc[(df["hma_fast"] > df["hma_slow"]) & (df["hma_fast"].shift() <= df["hma_slow"].shift()), "signal"] = 1 # BUY
df.loc[(df["hma_fast"] < df["hma_slow"]) & (df["hma_fast"].shift() >= df["hma_slow"].shift()), "signal"] = -1 # SELL

# Вывод последних сигналов
print(df[["ts", "close", "hma_fast", "hma_slow", "signal"]].tail(10))

#индикатор

📌 Подпишись  Crypto Python❗️
❤‍🔥6🔥4👍3
📌 Chande Momentum Oscillator Strategy – Фильтрация силы движения🧑‍💻

Суть индикатора:🛠️

Chande Momentum Oscillator (CMO) — осциллятор, разработанный Тушаром Чандом, отражает силу направленного движения цены.
Он похож на RSI, но:

- Использует абсолютные значения приростов и спадов

- Колеблется от −100 до +100

- Быстро реагирует на смену импульса

Типовые сигналы:💸

- CMO > +50 → сильный восходящий импульс (возможность входа в лонг)

- CMO < −50 → сильный нисходящий импульс (шорт или избегать лонга)

- CMO между −20 и +20 → флет / слабое движение

- Пересечения нуля → смена направления
import ccxt
import pandas as pd
import talib

# Настройки
exchange = ccxt.binance()
symbol = "BTC/USDT"
timeframe = "1h"
limit = 200

# Получение данных
ohlcv = exchange.fetch_ohlcv(symbol, timeframe=timeframe, limit=limit)
df = pd.DataFrame(ohlcv, columns=["ts", "open", "high", "low", "close", "volume"])
df["ts"] = pd.to_datetime(df["ts"], unit="ms")

# Расчёт CMO
df["cmo"] = talib.CMO(df["close"], timeperiod=14)

# Сигналы
df["signal"] = 0
df.loc[df["cmo"] > 50, "signal"] = 1 # Buy
df.loc[df["cmo"] < -50, "signal"] = -1 # Sell

# Вывод последних значений
print(df[["ts", "close", "cmo", "signal"]].tail(10))

#индикатор

📌 Подпишись  Crypto Python❗️
👍9🔥3❤‍🔥2
📌SuperTrend Indicator Strategy – Следование за трендом с динамическим уровнем🧑‍💻

Суть индикатора:🛠️

SuperTrend — трендовый индикатор, который строится на основе:

- ATR (среднего истинного диапазона) — измеряет волатильность,

- цены закрытия — для направления сигнала.

Он рисует динамический уровень поддержки/сопротивления, который перерисовывается при смене тренда.

Используется для:🧨

- входа в направлении тренда,
- удержания позиции,
- выставления трейлинг-стопа.

Сигналы:💸

- Цена пересекает SuperTrend снизу вверх → сигнал на покупку

- Цена пересекает SuperTrend сверху вниз → сигнал на продажу

import ccxt
import pandas as pd
import ta

# Получение данных
exchange = ccxt.binance()
symbol = "BTC/USDT"
ohlcv = exchange.fetch_ohlcv(symbol, timeframe="1h", limit=200)
df = pd.DataFrame(ohlcv, columns=["ts", "open", "high", "low", "close", "volume"])
df["ts"] = pd.to_datetime(df["ts"], unit="ms")

# Параметры SuperTrend
atr_period = 10
multiplier = 3.0

# Расчёт ATR
atr = ta.volatility.AverageTrueRange(high=df["high"], low=df["low"], close=df["close"], window=atr_period).average_true_range()
hl2 = (df["high"] + df["low"]) / 2
df["upperband"] = hl2 + (multiplier * atr)
df["lowerband"] = hl2 - (multiplier * atr)

# Логика SuperTrend
supertrend = []
direction = []
for i in range(len(df)):
if i == 0:
supertrend.append(df["upperband"][i])
direction.append(1)
else:
if df["close"][i] > supertrend[i-1]:
supertrend.append(df["lowerband"][i])
direction.append(1)
elif df["close"][i] < supertrend[i-1]:
supertrend.append(df["upperband"][i])
direction.append(-1)
else:
supertrend.append(supertrend[i-1])
direction.append(direction[i-1])

df["supertrend"] = supertrend
df["trend"] = direction

# Сигналы
df["signal"] = 0
df.loc[(df["trend"] == 1) & (df["trend"].shift(1) == -1), "signal"] = 1 # Покупка
df.loc[(df["trend"] == -1) & (df["trend"].shift(1) == 1), "signal"] = -1 # Продажа

# Вывод последних сигналов
print(df[["ts", "close", "supertrend", "trend", "signal"]].tail(10))

#индикатор

📌 Подпишись  Crypto Python❗️
🔥5👍4❤‍🔥3
📌Schaff Trend Cycle Strategy – Быстрые сигналы на основе MACD и рыночных циклов🧑‍💻

Суть индикатора:🛠️

Schaff Trend Cycle (STC) — это модифицированная версия MACD, разработанная Дугом Шаффом, которая сочетает:

- трендовые свойства MACD,

- фильтрацию через цикличность рынка (с помощью двойного применения стохастика).

В результате получается более быстрый и точный индикатор, чем MACD, с меньшим запаздыванием.

Основные сигналы STC:💸

- STC поднимается выше 25 или 50 → сигнал на покупку

- STC опускается ниже 75 или 50 → сигнал на продажу

- Также используются пересечения порогов и дивергенции как подтверждение

import ccxt
import pandas as pd
import numpy as np
import ta

# Получение данных
exchange = ccxt.binance()
symbol = "BTC/USDT"
ohlcv = exchange.fetch_ohlcv(symbol, timeframe="1h", limit=200)
df = pd.DataFrame(ohlcv, columns=["ts", "open", "high", "low", "close", "volume"])
df["ts"] = pd.to_datetime(df["ts"], unit="ms")

# Шаг 1: MACD
macd_line = ta.trend.macd(df["close"], window_slow=26, window_fast=12)
macd_signal = ta.trend.macd_signal(df["close"], window_slow=26, window_fast=12, window_sign=9)
macd_hist = macd_line - macd_signal

# Шаг 2: Стохастик от MACD
lowest = macd_hist.rolling(window=10).min()
highest = macd_hist.rolling(window=10).max()
stoch = 100 * (macd_hist - lowest) / (highest - lowest + 1e-9)

# Шаг 3: Стохастик от стохастика (фильтр циклов)
stc = stoch.rolling(window=3).mean()

df["stc"] = stc

# Генерация сигналов
df["signal"] = 0
df.loc[(df["stc"] > 25) & (df["stc"].shift() <= 25), "signal"] = 1 # Buy
df.loc[(df["stc"] < 75) & (df["stc"].shift() >= 75), "signal"] = -1 # Sell

# Вывод последних сигналов
print(df[["ts", "close", "stc", "signal"]].tail(10))

#индикатор

📌 Подпишись  Crypto Python❗️
👍6❤‍🔥1🔥1
📌Fisher Transform Trend Filter – фильтрация фейковых движений с помощью индикатора Фишера🧑‍💻

Суть стратегии:🛠️

Fisher Transform — это осциллятор, который преобразует ценовое движение в нормальное распределение, делая развороты и тренды более чёткими и симметричными.

Применяется как тренд-фильтр или точка разворота, особенно для:💸

- Фильтрации ложных импульсов,

- Подтверждения сигнала входа,

- Точечного выхода из позиции.

Преимущества Fisher Transform:💸

- Улавливает экстремумы с меньшим запаздыванием, чем RSI

- Хорошо работает в связке с другими трендовыми индикаторами (EMA, ADX)

- Идеален для фильтрации входов только по сильным разворотам
import ccxt
import pandas as pd
import numpy as np

# Данные
exchange = ccxt.binance()
symbol = "BTC/USDT"
ohlcv = exchange.fetch_ohlcv(symbol, timeframe="1h", limit=500)
df = pd.DataFrame(ohlcv, columns=["ts", "open", "high", "low", "close", "volume"])
df["ts"] = pd.to_datetime(df["ts"], unit="ms")

# Настройки Fisher
period = 10
hl2 = (df["high"] + df["low"]) / 2
min_low = hl2.rolling(window=period).min()
max_high = hl2.rolling(window=period).max()

# Нормализация
value = 2 * ((hl2 - min_low) / (max_high - min_low + 1e-9) - 0.5)
value = value.clip(-0.999, 0.999)

# Расчёт Fisher Transform
fisher = 0.5 * np.log((1 + value) / (1 - value))
df["fisher"] = fisher.rolling(2).mean()

# Сигналы
df["signal"] = 0
df.loc[(df["fisher"] > 0) & (df["fisher"].shift(1) < 0), "signal"] = 1 # Лонг
df.loc[(df["fisher"] < 0) & (df["fisher"].shift(1) > 0), "signal"] = -1 # Шорт

# Вывод последних сигналов
print(df[["ts", "close", "fisher", "signal"]].tail(10))

#индикатор

📌 Подпишись  Crypto Python❗️
👍103🔥2
📌VWAP Imbalance Entry – Вход при смещении торгов к одной стороне от VWAP🧑‍💻

Суть стратегии:🛠️

VWAP (Volume Weighted Average Price) — это средневзвешенная цена сделки по объёму.
Она часто выступает как балансная точка между покупателями и продавцами.
Когда цена и объёмы сильно сдвинуты на одну сторону от VWAP, это может сигнализировать о:

- доминировании одной стороны (покупатели или продавцы),

- готовности к импульсу или продолжению движения,

- потенциальном входе в позицию по направлению дисбаланса.

Принцип стратегии:💸

1. Вычисляем VWAP за сессию или торговый период

2. Анализируем, где проходит основной объём сделок — выше или ниже VWAP

3. Если 70%+ объёма идёт выше VWAP → лонговое смещение

4. Если 70%+ ниже VWAP → шортовое смещение

5. Вход по направлению дисбаланса (в сторону, где сосредоточен объём)
import ccxt
import pandas as pd

exchange = ccxt.binance()
symbol = "BTC/USDT"
limit = 200
tf = "1m"

# Получаем свечи
ohlcv = exchange.fetch_ohlcv(symbol, timeframe=tf, limit=limit)
df = pd.DataFrame(ohlcv, columns=["ts", "open", "high", "low", "close", "volume"])
df["ts"] = pd.to_datetime(df["ts"], unit="ms")

# Расчёт VWAP вручную
df["tp"] = (df["high"] + df["low"] + df["close"]) / 3
df["vwap_num"] = df["tp"] * df["volume"]
df["cum_vol"] = df["volume"].cumsum()
df["cum_vwap"] = df["vwap_num"].cumsum()
df["vwap"] = df["cum_vwap"] / df["cum_vol"]

# Определим, где прошёл объём — выше или ниже VWAP
df["side"] = df["close"] > df["vwap"]
above_vol = df[df["side"] == True]["volume"].sum()
below_vol = df[df["side"] == False]["volume"].sum()
total_vol = df["volume"].sum()

above_pct = above_vol / total_vol * 100
below_pct = below_vol / total_vol * 100

print(f"Объём выше VWAP: {above_pct:.1f}% | ниже VWAP: {below_pct:.1f}%")

# Генерация сигнала
if above_pct > 70:
print(" Объём сконцентрирован выше VWAP → сигнал на ЛОНГ")
elif below_pct > 70:
print(" Объём сконцентрирован ниже VWAP → сигнал на ШОРТ")
else:
print("Нет чёткого дисбаланса по VWAP")

#индикатор

📌 Подпишись  Crypto Python❗️
👍8❤‍🔥3
📌CCI Breakout Strategy – Вход при выходе CCI из зоны ±100🧑‍💻

Суть стратегии:🛠️

CCI (Commodity Channel Index) — осциллятор, измеряющий отклонение цены от её средней.
Значения в диапазоне ±100 считаются нормой, выход за пределы — сигнал силы.

Принцип стратегии:💸

Buy, когда CCI выходит выше +100 → сигнал восходящего импульса

Sell, когда CCI уходит ниже -100 → сигнал нисходящего импульса
import ccxt
import pandas as pd
import ta

# Данные с Binance
exchange = ccxt.binance()
symbol = "BTC/USDT"
ohlcv = exchange.fetch_ohlcv(symbol, timeframe="1h", limit=200)
df = pd.DataFrame(ohlcv, columns=["ts", "open", "high", "low", "close", "volume"])
df["ts"] = pd.to_datetime(df["ts"], unit="ms")

# CCI
cci = ta.trend.CCIIndicator(high=df["high"], low=df["low"], close=df["close"], window=20)
df["cci"] = cci.cci()

# Сигналы
df["signal"] = 0
df.loc[(df["cci"].shift(1) < 100) & (df["cci"] > 100), "signal"] = 1 # Вход в ЛОНГ
df.loc[(df["cci"].shift(1) > -100) & (df["cci"] < -100), "signal"] = -1 # Вход в ШОРТ

# Вывод
print(df[["ts", "close", "cci", "signal"]].tail(10))

#индикатор

📌 Подпишись  Crypto Python❗️
👍82🔥1
📌Slope of MA as Filter – Фильтрация сигналов по наклону скользящей средней🧑‍💻

Суть стратегии:🛠️

Скользящая средняя (MA) сама по себе показывает направление тренда,
но угол наклона MA (градиент) даёт информацию о силе этого тренда.

Фильтрация по наклону MA позволяет:🚀

- Исключать сделки во флэте,

- Входить только по направлению устойчивого движения,

- Повышать точность сигналов любой стратегии (пересечения, пробои, свечные паттерны и т.д.).

Как рассчитать наклон MA:🛠️

MA(t) — значение скользящей на текущей свече
MA(t - N) — значение MA N свечей назад

slope = (MA(t) - MA(t-N)) / N

Это приближённый градиент/угол наклона.

Можно интерпретировать:💸

slope > 0 — восходящий тренд

slope < 0 — нисходящий

abs(slope) мал — рынок во флэте

import ccxt
import pandas as pd
import ta

# Получение данных
exchange = ccxt.binance()
symbol = "BTC/USDT"
ohlcv = exchange.fetch_ohlcv(symbol, timeframe="1h", limit=300)
df = pd.DataFrame(ohlcv, columns=["ts", "open", "high", "low", "close", "volume"])
df["ts"] = pd.to_datetime(df["ts"], unit="ms")

# EMA и её наклон
period = 50
df["ema"] = ta.trend.ema_indicator(df["close"], window=period).ema_indicator()

# Расчёт наклона (на 5 свечей назад)
df["ema_slope"] = (df["ema"] - df["ema"].shift(5)) / 5

# Фильтр: считаем тренд сильным, если slope > 10 (например, в $)
df["trend_filter"] = 0
df.loc[df["ema_slope"] > 10, "trend_filter"] = 1 # Uptrend
df.loc[df["ema_slope"] < -10, "trend_filter"] = -1 # Downtrend

# Вывод
print(df[["ts", "close", "ema", "ema_slope", "trend_filter"]].tail(10))

#индикатор

📌 Подпишись  Crypto Python❗️
👍7🔥5❤‍🔥2