Estoy tratando de utilizar en una estrategia de negociación el indicador STC, pero no puedo averiguar por qué no funciona correctamente.
El gráfico que estoy utilizando es BTC/USDT en UTC como marco temporal.
Hora del gráfico: 01 feb 22 - 16:20 UTC
------------------- TradingView: ------------------------
Valor STC: 97,66
Ajustes STC:
---------------- Python: ----------------
He probado las siguientes bibliotecas:
Pands ta( enlace ):
dataframe.ta.stc(tclength=12, fast=26, slow=50, factor=0.5, append=True)
Indicadores técnicos( enlace )
dataframe['stc_2'] = technical.indicators.stc(dataframe, fast=26, slow=50, length=12)
Análisis técnico financiero( enlace )
dataframe['stc'] = fta.STC(dataframe, period_fast=26, period_slow=50, k_period=12, d_period=3, adjust=True)
Y también he intentado recrear el indicador convirtiendo el script pine de ici a python
def stoch(source, high, low, lenght):
return Series(100 * (source - low[-lenght:].min()) / (high[-lenght:].max() - low[-lenght:].min()))
def fixnan(s: Series):
mask = np.isnan(s)
s[mask] = np.interp(np.flatnonzero(mask), np.flatnonzero(~mask), s[~mask])
return s
def nz(s: Series):
return s.fillna(0)
def stc(ohlc: DataFrame, fast: int, slow: int, length: int, d1: int, d2: int):
macd = ta.EMA(ohlc['close'], timeperiod=fast) - ta.EMA(ohlc['close'], timeperiod=slow)
k = nz(fixnan(stoch(macd, macd, macd, length)))
d = ta.EMA(k, d1)
kd = nz(fixnan(stoch(d, d, d, length)))
stc = ta.EMA(kd, d2)
r1 = np.where(stc >= 100, 100, stc)
r2 = np.where(r1 <= 0, 0, r1)
return r2
dataframe['stc_MINE'] = stc(dataframe, 26, 50, 10, 3, 3)
A continuación se muestra el resultado de todos ellos:
Como se puede ver, ninguno de ellos es 97,66, ¿alguien podría explicarme qué he hecho mal o qué me estoy perdiendo?
Mi código:
Para reunir todos los datos y utilizar los indicadores he utilizado freqtrade
Para descargar los datos que he utilizado:
freqtrade download-data -t 5m --pairs BCH/USDT --erase --timerange 20210101-20220101
Y esta es la estrategia que he utilizado:
class Mine(IStrategy):
timeframe = '5m'
def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
dataframe['stc'] = fta.STC(dataframe, period_fast=26, period_slow=50, k_period=12, d_period=3, adjust=True)
dataframe['stc_2'] = technical.indicators.stc(dataframe, fast=26, slow=50, length=12)
dataframe.ta.stc(tclength=12, fast=26, slow=50, factor=0.5, append=True)
dataframe['stc_MINE'] = stc(dataframe, 26, 50, 10, 3, 3)
return dataframe
def populate_buy_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
return dataframe
def populate_sell_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
return dataframe
Ambos intercambios de allí los datos se descargan en TradingView y mi estrategia es Binance