添加新策略
This commit is contained in:
+1
-197
@@ -32,7 +32,6 @@ class ChanLun():
|
||||
time30 = 30
|
||||
time60 = 60
|
||||
time4h = 240
|
||||
last_peak = {'high': 0, 'low': float('inf')}
|
||||
def create_all_data(self, dataframe, ticker_indicator):
|
||||
all_data = dict()
|
||||
all_data['1m'] = dataframe
|
||||
@@ -78,15 +77,6 @@ class ChanLun():
|
||||
#print(klc.start_time, klc.end_time,klc.next.start_time, klc.next.end_time,klc.fx, "BOTTOM")
|
||||
return Chan_FX_TYPE.BOTTOM
|
||||
return Chan_FX_TYPE.UNKNOWN
|
||||
def get_macd(self, df):
|
||||
fast = 8
|
||||
slow = 15
|
||||
period = 2
|
||||
macd = ta.MACD(df, fastperiod=fast, slowperiod=slow, signalperiod=period)
|
||||
df['macd'] = macd['macd']
|
||||
df['macdsignal'] = macd['macdsignal']
|
||||
df['macdhist'] = macd['macdhist']
|
||||
return df
|
||||
def plot_dataframe(self, dataframe):
|
||||
klc_list = self.get_klc_list(dataframe)
|
||||
bi_list= self.cal_bi_list(klc_list)
|
||||
@@ -200,13 +190,6 @@ class ChanLun():
|
||||
for df in df_list:
|
||||
state_list.append(self.get_klc_state_list(df))
|
||||
return state_list
|
||||
def print_data(self, dataframe):
|
||||
klc_list = self.get_klc_list(dataframe)
|
||||
bi_list = self.cal_bi_list(klc_list)
|
||||
seg_list = self.get_seg_list(bi_list)
|
||||
bsp_list, zs_list = self.calculate_zs(bi_list, seg_list)
|
||||
bi_macd_div_list = self.get_bi_macd_div_list(bi_list, dataframe)
|
||||
seg_macd_div_list = self.get_seg_macd_div_list(seg_list, dataframe)
|
||||
def resample_bsp_list(self, bsp_list, dataframe):
|
||||
bsp_index = 0
|
||||
resampled_bsp_list = []
|
||||
@@ -287,10 +270,6 @@ class ChanLun():
|
||||
c,
|
||||
v
|
||||
]
|
||||
if h > self.last_peak['high']:
|
||||
self.last_peak['high'] = h
|
||||
if l < self.last_peak['low']:
|
||||
self.last_peak['low'] = l
|
||||
#klu = KLU(self.create_item_dict(item_data, GetColumnNameFromFieldList(fields)))
|
||||
klu = ChanKLU(time_str, o, h, l, c, v)
|
||||
#print(klu.time, klu.open, klu.high, klu.low, klu.close, klu.volume)
|
||||
@@ -314,31 +293,6 @@ class ChanLun():
|
||||
return df['volume_ratio']
|
||||
def calculate_zs(self, bi_list, seg_list):
|
||||
return self.get_zs_list(bi_list, seg_list)
|
||||
def get_full_klc_list(self, dataframe):
|
||||
klc_list = self.get_klc_list(dataframe)
|
||||
bi_list = self.cal_bi_list(klc_list)
|
||||
return klc_list
|
||||
def print_bi_klc(self, dataframe):
|
||||
klc_list = self.get_klc_list(dataframe)
|
||||
bi_list = self.cal_bi_list(klc_list)
|
||||
rsi_list = dataframe['rsi']
|
||||
fx_list = []
|
||||
for klc in klc_list:
|
||||
if klc.klc_fx_type != Chan_KLC_FX.UNKNOWN:
|
||||
if klc.bi.dir == Chan_BI_DIR.UP and klc.volume_ratio > 2:
|
||||
print(klc.start_time, klc.end_time, klc.klc_fx_type, klc.rsi, klc.volume_ratio)
|
||||
fx_list.append(klc)
|
||||
elif klc.bi.dir == Chan_BI_DIR.DOWN and klc.volume_ratio > 2:
|
||||
print(klc.start_time, klc.end_time, klc.klc_fx_type, klc.rsi, klc.volume_ratio)
|
||||
fx_list.append(klc)
|
||||
bi_start_index_list = []
|
||||
for bi in bi_list:
|
||||
bi_start_index_list.append(bi.start_klc.index)
|
||||
if bi.end_klc:
|
||||
bi.cal_macdhist()
|
||||
bi.cal_macd_div()
|
||||
print("Bi:", bi.start_time, bi.end_time, bi.dir, bi.macd_hist, bi.macd_div)
|
||||
klc_index_count = 0
|
||||
def get_seg_list(self, bi_list):
|
||||
seg_list = []
|
||||
up_bi_list = []
|
||||
@@ -617,157 +571,7 @@ class ChanLun():
|
||||
break
|
||||
"""
|
||||
return seg_list
|
||||
|
||||
def get_bi_zs_list(self, bi_list):
|
||||
"""识别笔中枢列表
|
||||
|
||||
与线段中枢不同,笔中枢是由连续的同向笔构成,是更细粒度的中枢结构
|
||||
|
||||
Args:
|
||||
bi_list: 笔列表
|
||||
|
||||
Returns:
|
||||
bi_zs_list: 笔中枢列表
|
||||
"""
|
||||
bi_zs_list = []
|
||||
if len(bi_list) < 3: # 至少需要3个笔才能形成中枢
|
||||
print("笔数量不足,无法形成中枢")
|
||||
return bi_zs_list
|
||||
|
||||
last_zs = None
|
||||
first_bi_out = None
|
||||
in_again = False
|
||||
bi_out_count = 0
|
||||
|
||||
# 遍历所有笔,识别中枢
|
||||
for i in range(2, len(bi_list)):
|
||||
# 确保当前笔和前两个笔都是完成的
|
||||
if not bi_list[i].end_klc or not bi_list[i-1].end_klc or not bi_list[i-2].end_klc:
|
||||
continue
|
||||
|
||||
current_bi = bi_list[i]
|
||||
prev_bi = bi_list[i-1]
|
||||
prev_prev_bi = bi_list[i-2]
|
||||
|
||||
# 如果没有中枢或上一个中枢已完成
|
||||
if len(bi_zs_list) == 0 or (last_zs and last_zs.is_sure):
|
||||
# 检查是否是三个连续同向笔
|
||||
if (current_bi.dir == prev_bi.dir == prev_prev_bi.dir):
|
||||
# 创建潜在中枢
|
||||
if current_bi.dir == Chan_BI_DIR.UP:
|
||||
# 向上的三笔区间定义中枢
|
||||
# 中枢的上沿:取三个笔的终点的最小值
|
||||
# 中枢的下沿:取三个笔的起点的最大值
|
||||
zd = max(prev_prev_bi.start_klc.low, prev_bi.start_klc.low, current_bi.start_klc.low)
|
||||
zg = min(prev_prev_bi.end_klc.high, prev_bi.end_klc.high, current_bi.end_klc.high)
|
||||
|
||||
# 确保中枢有效(上沿大于下沿)
|
||||
if zg > zd:
|
||||
print(f"发现向上笔中枢: 起始时间={prev_prev_bi.start_klc.start_time}, ZG={zg}, ZD={zd}")
|
||||
zs = ChanZS(prev_prev_bi.start_klc, zg, zd)
|
||||
zs.start_bi = prev_prev_bi
|
||||
zs.start_idx = i-2
|
||||
zs.end_bi = current_bi
|
||||
zs.end_idx = i
|
||||
zs.end_klc = current_bi.end_klc
|
||||
zs.type = "BI_ZS"
|
||||
zs.direction = Chan_ZS_DIR.UP
|
||||
zs.sure_time = None # 中枢尚未确认完成
|
||||
bi_zs_list.append(zs)
|
||||
last_zs = zs
|
||||
else:
|
||||
# 向下的三笔区间定义中枢
|
||||
# 中枢的上沿:取三个笔的起点的最小值
|
||||
# 中枢的下沿:取三个笔的终点的最大值
|
||||
zg = min(prev_prev_bi.start_klc.high, prev_bi.start_klc.high, current_bi.start_klc.high)
|
||||
zd = max(prev_prev_bi.end_klc.low, prev_bi.end_klc.low, current_bi.end_klc.low)
|
||||
|
||||
# 确保中枢有效(上沿大于下沿)
|
||||
if zg > zd:
|
||||
print(f"发现向下笔中枢: 起始时间={prev_prev_bi.start_klc.start_time}, ZG={zg}, ZD={zd}")
|
||||
zs = ChanZS(prev_prev_bi.start_klc, zg, zd)
|
||||
zs.start_bi = prev_prev_bi
|
||||
zs.start_idx = i-2
|
||||
zs.end_bi = current_bi
|
||||
zs.end_idx = i
|
||||
zs.end_klc = current_bi.end_klc
|
||||
zs.type = "BI_ZS"
|
||||
zs.direction = Chan_ZS_DIR.DOWN
|
||||
zs.sure_time = None # 中枢尚未确认完成
|
||||
bi_zs_list.append(zs)
|
||||
last_zs = zs
|
||||
# 处理已有的未完成中枢
|
||||
elif last_zs and not last_zs.is_sure:
|
||||
# 当前笔与中枢最后一笔方向相同,可能延伸中枢
|
||||
if current_bi.dir == prev_bi.dir:
|
||||
if last_zs.direction == Chan_ZS_DIR.UP and current_bi.dir == Chan_BI_DIR.UP:
|
||||
# 检查是否仍在中枢内:向上时终点高价在中枢区间内
|
||||
if current_bi.end_klc.high >= last_zs.zd and current_bi.end_klc.high <= last_zs.zg:
|
||||
print(f"延伸向上笔中枢: 终点时间={current_bi.end_klc.end_time}")
|
||||
# 延伸中枢
|
||||
last_zs.end_klc = current_bi.end_klc
|
||||
last_zs.end_bi = current_bi
|
||||
last_zs.end_idx = i
|
||||
else:
|
||||
# 笔离开中枢,记录第一个离开的笔
|
||||
if not first_bi_out:
|
||||
first_bi_out = current_bi
|
||||
bi_out_count += 1
|
||||
print(f"笔离开向上中枢: 时间={current_bi.end_klc.end_time}, 价格={current_bi.end_klc.high}, 中枢上沿={last_zs.zg}")
|
||||
else:
|
||||
if not in_again:
|
||||
# 第二次离开,确认中枢完成
|
||||
print(f"确认向上笔中枢完成: 时间={current_bi.end_klc.end_time}")
|
||||
last_zs.is_sure = True
|
||||
last_zs.sure_bi = current_bi
|
||||
last_zs.sure_time = current_bi.end_klc.end_time
|
||||
elif last_zs.direction == Chan_ZS_DIR.DOWN and current_bi.dir == Chan_BI_DIR.DOWN:
|
||||
# 检查是否仍在中枢内:向下时终点低价在中枢区间内
|
||||
if current_bi.end_klc.low <= last_zs.zg and current_bi.end_klc.low >= last_zs.zd:
|
||||
print(f"延伸向下笔中枢: 终点时间={current_bi.end_klc.end_time}")
|
||||
# 延伸中枢
|
||||
last_zs.end_klc = current_bi.end_klc
|
||||
last_zs.end_bi = current_bi
|
||||
last_zs.end_idx = i
|
||||
else:
|
||||
# 笔离开中枢,记录第一个离开的笔
|
||||
if not first_bi_out:
|
||||
first_bi_out = current_bi
|
||||
bi_out_count += 1
|
||||
print(f"笔离开向下中枢: 时间={current_bi.end_klc.end_time}, 价格={current_bi.end_klc.low}, 中枢下沿={last_zs.zd}")
|
||||
else:
|
||||
if not in_again:
|
||||
# 第二次离开,确认中枢完成
|
||||
print(f"确认向下笔中枢完成: 时间={current_bi.end_klc.end_time}")
|
||||
last_zs.is_sure = True
|
||||
last_zs.sure_bi = current_bi
|
||||
last_zs.sure_time = current_bi.end_klc.end_time
|
||||
# 方向改变,判断是否破坏中枢
|
||||
else:
|
||||
# 方向改变可能导致重新进入中枢或破坏中枢
|
||||
# 向上中枢被向下笔破坏:低点低于中枢下沿
|
||||
# 向下中枢被向上笔破坏:高点高于中枢上沿
|
||||
if (last_zs.direction == Chan_ZS_DIR.UP and current_bi.end_klc.low < last_zs.zd) or \
|
||||
(last_zs.direction == Chan_ZS_DIR.DOWN and current_bi.end_klc.high > last_zs.zg):
|
||||
# 破坏中枢
|
||||
print(f"笔中枢被破坏: 方向={current_bi.dir}, 时间={current_bi.end_klc.end_time}")
|
||||
last_zs.is_sure = True
|
||||
last_zs.sure_bi = current_bi
|
||||
last_zs.sure_time = current_bi.end_klc.end_time
|
||||
elif first_bi_out:
|
||||
# 重新进入中枢
|
||||
print(f"笔重新进入中枢: 时间={current_bi.end_klc.end_time}")
|
||||
in_again = True
|
||||
first_bi_out = None
|
||||
# 延伸中枢
|
||||
last_zs.end_klc = current_bi.end_klc
|
||||
last_zs.end_bi = current_bi
|
||||
last_zs.end_idx = i
|
||||
|
||||
# 打印识别结果
|
||||
print(f"笔中枢识别完成,共找到 {len(bi_zs_list)} 个笔中枢")
|
||||
return bi_zs_list
|
||||
#-------------------------------------------------------------------
|
||||
|
||||
def cal_bi_list(self, klc_list):
|
||||
bi_list = []
|
||||
last_top = None
|
||||
|
||||
Reference in New Issue
Block a user