# -*- coding: utf-8 -*-
"""
author: zengbin93
email: zeng_bin8888@163.com
create_dt: 2022/4/13 15:03
describe: 持仓相关信号
"""
from collections import OrderedDict
from czsc.objects import Operate, Signal, PositionLong
from czsc.traders.advanced import CzscAdvancedTrader
[docs]def get_s_long01(cat: CzscAdvancedTrader, th=300):
"""多头持仓信号:亏损"""
pos = cat.long_pos
k1, k2, k3 = '多头', '亏损', f'超{th}BP'
s = OrderedDict()
v1 = '否'
if pos.pos > 0:
latest_price = cat.latest_price
last_o = [x for x in pos.operates[-50:] if x['op'] == Operate.LO][-1]
last_o_price = last_o['price']
yk = (latest_price - last_o_price) / last_o_price
if yk * 10000 < -th:
v1 = '是'
signal = Signal(k1=k1, k2=k2, k3=k3, v1=v1)
s[signal.key] = signal.value
return s
[docs]def get_s_long02(cat: CzscAdvancedTrader, th=300):
"""多头持仓信号:回撤"""
pos = cat.long_pos
k1, k2, k3 = '多头', '回撤', f'超{th}BP'
s = OrderedDict()
v1 = '否'
if pos.pos > 0 and cat.latest_price <= pos.long_high:
hc = abs(cat.latest_price / pos.long_high - 1)
if hc * 10000 > th:
v1 = '是'
signal = Signal(k1=k1, k2=k2, k3=k3, v1=v1)
s[signal.key] = signal.value
return s
[docs]def get_s_long03(cat: CzscAdvancedTrader, th=100):
"""多头持仓信号:持仓时间"""
pos = cat.long_pos
k1, k2, k3 = '多头', '持仓时间', f'超{th}根基础K线'
s = OrderedDict()
v1 = '否'
if pos.pos > 0:
lo_bid = [x for x in pos.operates[-50:] if x['op'] == Operate.LO][-1]['bid']
bid = cat.bg.bars[cat.base_freq][-1].id
if bid - lo_bid > th:
v1 = '是'
signal = Signal(k1=k1, k2=k2, k3=k3, v1=v1)
s[signal.key] = signal.value
return s
[docs]def get_s_long04(cat: CzscAdvancedTrader, th=5):
"""多头持仓信号:持仓亏损时间"""
pos = cat.long_pos
k1, k2, k3 = '多头', '持仓亏损时间', f'超{th}根基础K线'
s = OrderedDict()
v1 = '否'
if pos.pos > 0:
lo = [x for x in pos.operates[-50:] if x['op'] == Operate.LO][-1]
hold_bars = [x for x in cat.kas[cat.base_freq].bars_raw[-(th+50):] if x.id >= lo['bid']]
loss_bars = [1 if x.close < lo['price'] else 0 for x in hold_bars]
if sum(loss_bars) > th:
v1 = '是'
signal = Signal(k1=k1, k2=k2, k3=k3, v1=v1)
s[signal.key] = signal.value
return s
[docs]def get_s_long05(cat: CzscAdvancedTrader, span="月", th=500):
"""多头持仓信号:周期累计亏损"""
pos: PositionLong = cat.long_pos
k1, k2, k3 = '多头', f'本{span}累计亏损', f'超{th}BP'
s = OrderedDict()
if span == '周':
dt_fmt = '%Y年%W周'
elif span == '月':
dt_fmt = '%Y年%m月'
else:
raise ValueError
dt_ = cat.end_dt.strftime(dt_fmt)
pairs = [x for x in pos.pairs if x['平仓时间'].strftime(dt_fmt) == dt_]
v1 = '否'
if sum([x['盈亏比例'] for x in pairs]) < -th / 10000:
v1 = '是'
signal = Signal(k1=k1, k2=k2, k3=k3, v1=v1)
s[signal.key] = signal.value
return s
def get_s_long06(cat: CzscAdvancedTrader, th=500):
"""多头持仓信号:最大盈亏
在多头持仓期间的最低价与成本价之间的盈亏计算;主要用于买入后盈亏到一定程度,启动保护措施
"""
pos = cat.long_pos
k1, k2, k3 = '多头', '最大盈亏', f'超{th}BP'
s = OrderedDict()
v1 = v2 = '其他'
if pos.pos > 0:
lo = [x for x in pos.operates[-50:] if x['op'] == Operate.LO][-1]
buy_price = lo['price']
hold_bars = [x for x in cat.kas[cat.base_freq].bars_raw[-100:] if x.id >= lo['bid']]
min_price = min([x.low for x in hold_bars])
max_price = max([x.high for x in hold_bars])
cur_price = hold_bars[-1].close
if cur_price > buy_price * 1.01:
v1 = "是" if (max_price / buy_price - 1) * 10000 > th else "否"
v2 = "盈利"
else:
v1 = '是' if (min_price / buy_price - 1) * 10000 < -th else "否"
v2 = "亏损"
signal = Signal(k1=k1, k2=k2, k3=k3, v1=v1, v2=v2)
s[signal.key] = signal.value
return s