为什么 TA-Lib 的 ATR 指标不起作用?
Why is the ATR Indicator of TA-Lib not working?
我在使用 TA-Lib 库中的 ATR 指标时遇到一些问题。其他所有指标似乎都运行良好。
这是 python 中的代码:
import json
import numpy
import talib
import websocket
# *******PARAMETERS
# Name of Socket for BTC in USDT 1min Candle
SOCKET = "wss://stream.binance.com:9443/ws/btcusdt@kline_1m"
# Arrays
closes = []
highs = []
lows = []
# ***Websocket definition***
def on_open_ws(ws):
print('opened connection')
def on_close_ws(ws):
print('closed connection')
def on_message_ws(ws, message):
json_message = json.loads(message)
# only watching the candle infos in received message
candle = json_message['k']
# getting close, high and low values
is_candle_closed = candle['x']
close = float(candle['c'])
high = float(candle['h'])
low = float(candle['l'])
if is_candle_closed:
closes.append(close) # add close price to closes-array
np_closes = numpy.array(closes) # convert closes-array in numpy
c_close = np_closes[-1] # current close
p_close = np_closes[-2] # previous close
print(len(closes))
highs.append(high)
np_highs = numpy.array(highs)
last_high = np_highs[-1]
lows.append(low)
np_lows = numpy.array(lows)
last_low = np_lows[-1]
# Set ATR
atr = talib.ATR(np_highs, np_lows, np_closes, timeperiod=14)
last_atr = atr[-1]
print('last atr')
print(last_atr)
ws = websocket.WebSocketApp(SOCKET, on_open=on_open_ws, on_close=on_close_ws, on_message=on_message_ws)
# Run websocket app
ws.run_forever()
最后的命令"print('last atr')和print(last_atr)不打印,提示atr没有工作
是否知道问题出在哪里?
我尝试只使用最后的高、低和收盘值以及非数字值,但这并没有改变任何东西。我什至没有得到前几个值的“nan”答案...
所以我通过编写自己的 ATR 解决了我的问题,这比我想象的要简单得多。如果它可以帮助任何人继承代码
def true_range(high, low, p_close):
high_low = high - low
high_close = numpy.abs(high - p_close)
low_close = numpy.abs(low - p_close)
trange = max(high_low, high_close, low_close)
return trange
# Set TR
last_tr = true_range(last_high, last_low, p_close)
tr.append(last_tr)
if len(tr) > ATR_PERIOD:
del tr[0]
# Set ATR (SMA smoothing but need RMA)
atr = sum(tr) / ATR_PERIOD
print('atr ', atr)
ATR_PERIOD就是你要设置的周期。
对于ATR_PERIOD的长度,你显然会得到错误的数字,但之后你应该没问题
您第一次使用 is_candle_closed == true
调用 on_message_ws()
在第 p_close = np_closes[-2] # previous close
行崩溃,因为 closes
中只有 1 个元素。
此次崩溃后,下一次使用 is_candle_closed == true
调用 on_message_ws()
将继续调用 len(closes) == 2
和 len(lows) == len(highs) == 1
,然后在 talib.ATR()
调用 [=19] =].
以此类推
P.S。我还建议使用 numpy.array(closes, dtype='double')
而不是 numpy.array(closes)
,因为 talib.ATR()
会因 Exception: input array type is not double
而崩溃。从 binance 接收的当前数据不会发生这种情况,但为了安全起见,我会确保数组转换为双精度。
我在使用 TA-Lib 库中的 ATR 指标时遇到一些问题。其他所有指标似乎都运行良好。
这是 python 中的代码:
import json
import numpy
import talib
import websocket
# *******PARAMETERS
# Name of Socket for BTC in USDT 1min Candle
SOCKET = "wss://stream.binance.com:9443/ws/btcusdt@kline_1m"
# Arrays
closes = []
highs = []
lows = []
# ***Websocket definition***
def on_open_ws(ws):
print('opened connection')
def on_close_ws(ws):
print('closed connection')
def on_message_ws(ws, message):
json_message = json.loads(message)
# only watching the candle infos in received message
candle = json_message['k']
# getting close, high and low values
is_candle_closed = candle['x']
close = float(candle['c'])
high = float(candle['h'])
low = float(candle['l'])
if is_candle_closed:
closes.append(close) # add close price to closes-array
np_closes = numpy.array(closes) # convert closes-array in numpy
c_close = np_closes[-1] # current close
p_close = np_closes[-2] # previous close
print(len(closes))
highs.append(high)
np_highs = numpy.array(highs)
last_high = np_highs[-1]
lows.append(low)
np_lows = numpy.array(lows)
last_low = np_lows[-1]
# Set ATR
atr = talib.ATR(np_highs, np_lows, np_closes, timeperiod=14)
last_atr = atr[-1]
print('last atr')
print(last_atr)
ws = websocket.WebSocketApp(SOCKET, on_open=on_open_ws, on_close=on_close_ws, on_message=on_message_ws)
# Run websocket app
ws.run_forever()
最后的命令"print('last atr')和print(last_atr)不打印,提示atr没有工作
是否知道问题出在哪里?
我尝试只使用最后的高、低和收盘值以及非数字值,但这并没有改变任何东西。我什至没有得到前几个值的“nan”答案...
所以我通过编写自己的 ATR 解决了我的问题,这比我想象的要简单得多。如果它可以帮助任何人继承代码
def true_range(high, low, p_close):
high_low = high - low
high_close = numpy.abs(high - p_close)
low_close = numpy.abs(low - p_close)
trange = max(high_low, high_close, low_close)
return trange
# Set TR
last_tr = true_range(last_high, last_low, p_close)
tr.append(last_tr)
if len(tr) > ATR_PERIOD:
del tr[0]
# Set ATR (SMA smoothing but need RMA)
atr = sum(tr) / ATR_PERIOD
print('atr ', atr)
ATR_PERIOD就是你要设置的周期。 对于ATR_PERIOD的长度,你显然会得到错误的数字,但之后你应该没问题
您第一次使用 is_candle_closed == true
调用 on_message_ws()
在第 p_close = np_closes[-2] # previous close
行崩溃,因为 closes
中只有 1 个元素。
此次崩溃后,下一次使用 is_candle_closed == true
调用 on_message_ws()
将继续调用 len(closes) == 2
和 len(lows) == len(highs) == 1
,然后在 talib.ATR()
调用 [=19] =].
以此类推
P.S。我还建议使用 numpy.array(closes, dtype='double')
而不是 numpy.array(closes)
,因为 talib.ATR()
会因 Exception: input array type is not double
而崩溃。从 binance 接收的当前数据不会发生这种情况,但为了安全起见,我会确保数组转换为双精度。