0

我第一次使用TaLib和烛台,并从编写检测烛台的代码开始。我正在使用 CCXT 获取Binance USDT 的数据 1 小时

它正在以下时间戳上检测锤子:

ts
2021-10-15 19:00:00+00:00    100
2021-10-16 20:00:00+00:00    100
2021-10-17 12:00:00+00:00    100

根据我的理解,锤形蜡烛是看涨/绿色的,但是当我查看给定时间戳上的图表时,我发现它是红色的。我究竟做错了什么?所有时间戳均采用 UTC。代码如下:

import pandas as pd
import ccxt
from datetime import datetime, timedelta

import talib


def gen_ts_text(ts):
    timestamp = ts / 1000
    dt_object = datetime.utcfromtimestamp(timestamp)
    # print(dt_object.strftime('%Y-%m-%d %H:%M:%S'))
    return dt_object.strftime('%Y-%m-%d %H:%M:%S')


def get_data(pair, duration):
    exchange = ccxt.binance()
    # A week old data
    ohlcv = exchange.fetch_ohlcv(pair, timeframe=duration, limit=100)
    df = pd.DataFrame(ohlcv, columns=['ts', 'open', 'high', 'low', 'close', 'volume'])
    df['ts'] = df['ts'].apply(gen_ts_text)
    df['ts'] = pd.to_datetime(df['ts']).dt.tz_localize('UTC')
    df.set_index("ts", inplace=True)
    return df


def hammer(open, high, low, close):
    result = talib.CDLHAMMER(open, high, low, close)
    return result

主文件

from ta_functions import *

# https://www.binance.com/en/trade/BTC_USDT
if __name__ == '__main__':
    data = get_data('BTC/USDT', '1h')
    print('-------------------------------------------')
    hammer_pattern = hammer(data['open'], data['high'], data['low'], data['close'])
    # hanging_pattern = hangging_man(data['open'], data['high'], data['low'], data['close'])

    data['hammer'] = hammer_pattern
    # data['hanging_man'] = hanging_pattern
    print('HAMMER ......')
    print(data['hammer'][data['hammer'] > 0])
    print(len(data['hammer'][data['hammer'] > 0]))

在此处输入图像描述

4

1 回答 1

1

https://stackoverflow.com/a/65978978/13703615中,@Ran A 提到了基于 TaLib 包方法的限制,导致“错误”的锤形烛台检测。

这是我自定义的用于识别锤形烛台的函数,无论它是处于低位还是高位:

import numpy as np
import decimal

def pattern_hammer(df: pd.DataFrame()):
    """
    Expected df contains Open, High, Low, Close,
    """
    # Compute percentile
    for level in [50, 90]:
        df[f'{level}_percentile'] = df[['high', 'low']].apply(lambda x: np.percentile(x, q=decimal.Decimal(level)),
                                                              axis=1)

    condition = ((df['open'].values >= df['50_percentile'].values)  # open larger then 50 percentile, i.e. at the upper half
                 & (df['close'].values >= df['90_percentile'].values)  # close larger then 90 percentile, i.e. at the top of candlestick
                 & (df['close'].values >= df['open'].values)  # bullish candlestick
                 )

    df['hammer'] = np.where(condition, 1, 0)
    return df

锤纹的定义因用户而异,最好在计算前定义好自己的。可以添加可以帮助您识别模式的标准。

希望它可以驱使您找到最终的解决方案!

于 2022-01-11T05:56:03.833 回答