Source code for czsc.signals.example

# -*- coding: utf-8 -*-
"""
author: zengbin93
email: zeng_bin8888@163.com
create_dt: 2022/7/3 19:07
describe: 信号计算案例汇总
"""

import numpy as np
try:
    import talib as ta
except:
    from czsc.utils import ta
from collections import OrderedDict
from typing import List, Union, Tuple, Dict
from czsc.objects import Freq, Signal, RawBar, NewBar
from czsc.traders.advanced import CzscAdvancedTrader
from czsc.signals.utils import check_cross_info


[docs]def update_sma_cache(cat: CzscAdvancedTrader, freq: str, sma_params: Tuple = (5, 13, 21, 34, 55, 89, 144, 233)): """更新某个级别的均线缓存 :param cat: 交易对象 :param freq: 指定周期 :param sma_params: 均线参数 :return: """ assert freq in cat.freqs, f"{freq} 不在 {cat.freqs} 中" cache_key = f"{freq}均线" sma_cache = cat.cache.get(cache_key, {}) sma_cache['update_dt'] = cat.end_dt close = np.array([x.close for x in cat.kas[freq].bars_raw]) sma_cache['close'] = close for t in sma_params: sma_cache[f"SMA{t}"] = ta.SMA(close, timeperiod=t) cat.cache[cache_key] = sma_cache
[docs]def update_macd_cache(cat: CzscAdvancedTrader, freq: str): """更新某个级别的均线缓存 :param cat: 交易对象 :param freq: 指定周期 :return: """ assert freq in cat.freqs, f"{freq} 不在 {cat.freqs} 中" cache_key = f"{freq}MACD" cache = cat.cache.get(cache_key, {}) cache['update_dt'] = cat.end_dt close = np.array([x.close for x in cat.kas[freq].bars_raw]) cache['close'] = close dif, dea, macd = ta.MACD(close, fastperiod=12, slowperiod=26, signalperiod=9) cross = check_cross_info(dif, dea) cache.update({"dif": dif, 'dea': dea, 'macd': macd, 'cross': cross}) cat.cache[cache_key] = cache
[docs]def update_boll_cache(cat: CzscAdvancedTrader, freq: str): """更新某个级别的均线缓存 :param cat: 交易对象 :param freq: 指定周期 :return: """ assert freq in cat.freqs, f"{freq} 不在 {cat.freqs} 中" cache_key = f"{freq}BOLL" cache = cat.cache.get(cache_key, {}) cache['update_dt'] = cat.end_dt close = np.array([x.close for x in cat.kas[freq].bars_raw]) cache['close'] = close u1, m, l1 = ta.BBANDS(close, timeperiod=20, nbdevup=1.382, nbdevdn=1.382, matype=ta.MA_Type.SMA) u2, m, l2 = ta.BBANDS(close, timeperiod=20, nbdevup=2, nbdevdn=2, matype=ta.MA_Type.SMA) u3, m, l3 = ta.BBANDS(close, timeperiod=20, nbdevup=2.764, nbdevdn=2.764, matype=ta.MA_Type.SMA) cache.update({"上轨3": u3, "上轨2": u2, "上轨1": u1, "中线": m, "下轨1": l1, "下轨2": l2, "下轨3": l3}) cat.cache[cache_key] = cache
[docs]def single_sma(cat: CzscAdvancedTrader, freq: str, t_seq=(5, 13, 21)) -> OrderedDict: """单均线相关信号 完全分类: Signal('日线_倒1K_SMA5_多头_向上_任意_0'), Signal('日线_倒1K_SMA5_空头_向下_任意_0'), Signal('日线_倒1K_SMA5_多头_向下_任意_0'), Signal('日线_倒1K_SMA5_空头_向上_任意_0'), Signal('日线_倒1K_SMA13_空头_向下_任意_0'), Signal('日线_倒1K_SMA13_空头_向上_任意_0'), Signal('日线_倒1K_SMA13_多头_向上_任意_0'), Signal('日线_倒1K_SMA13_多头_向下_任意_0'), Signal('日线_倒1K_SMA21_空头_向下_任意_0'), Signal('日线_倒1K_SMA21_多头_向下_任意_0'), Signal('日线_倒1K_SMA21_多头_向上_任意_0'), Signal('日线_倒1K_SMA21_空头_向上_任意_0') :param cat: :param freq: :param t_seq: :return: """ assert freq in cat.freqs, f"{freq} 不在 {cat.freqs} 中" cache_key = f"{freq}均线" sma_cache = cat.cache[cache_key] assert sma_cache and sma_cache['update_dt'] == cat.end_dt s = OrderedDict() k1 = freq k2 = "倒1K" close = sma_cache['close'] for t in t_seq: sma = sma_cache[f"SMA{t}"] if len(sma) == 0: v1, v2 = '其他', '其他' else: v1 = "多头" if close[-1] >= sma[-1] else "空头" v2 = "向上" if sma[-1] >= sma[-2] else "向下" x1 = Signal(k1=k1, k2=k2, k3=f"SMA{t}", v1=v1, v2=v2) s[x1.key] = x1.value return s
[docs]def macd_base(cat: CzscAdvancedTrader, freq: str): """MACD柱子信号 完全分类: Signal('日线_倒1K_MACD_空头_向下_任意_0'), Signal('日线_倒1K_MACD_多头_向下_任意_0'), Signal('日线_倒1K_MACD_空头_向上_任意_0'), Signal('日线_倒1K_MACD_多头_向上_任意_0'), Signal('日线_倒1K_MACD强弱_强势_任意_任意_0'), Signal('日线_倒1K_MACD强弱_超弱_任意_任意_0'), Signal('日线_倒1K_MACD强弱_超强_任意_任意_0'), Signal('日线_倒1K_MACD强弱_弱势_任意_任意_0') :return: """ s = OrderedDict() cache_key = f"{freq}MACD" cache = cat.cache[cache_key] assert cache and cache['update_dt'] == cat.end_dt dif, dea, macd = cache['dif'], cache['dea'], cache['macd'] v1 = "多头" if macd[-1] >= 0 else "空头" v2 = "向上" if macd[-1] >= macd[-2] else "向下" signal = Signal(k1=freq, k2="倒1K", k3="MACD", v1=v1, v2=v2) s[signal.key] = signal.value # MACD强弱 if dif[-1] >= dea[-1] >= 0: v1 = "超强" elif dif[-1] - dea[-1] > 0: v1 = "强势" elif dif[-1] <= dea[-1] <= 0: v1 = "超弱" elif dif[-1] - dea[-1] < 0: v1 = "弱势" else: v1 = "其他" signal = Signal(k1=freq, k2="倒1K", k3="MACD强弱", v1=v1) s[signal.key] = signal.value return s