Add to strategy
This commit is contained in:
+2
-2
@@ -156,8 +156,8 @@ class ChanLun():
|
|||||||
else:
|
else:
|
||||||
fx_list.append(0)
|
fx_list.append(0)
|
||||||
klc_strength_list.append(klc.cal_fx_strength(2))
|
klc_strength_list.append(klc.cal_fx_strength(2))
|
||||||
#if klc.klc_fx_type != Chan_KLC_FX.UNKNOWN and klc.cal_fx_strength() > 1:
|
if klc.klc_fx_type != Chan_KLC_FX.UNKNOWN and klc.cal_fx_strength() > 1:
|
||||||
#print(klc.start_time, klc.end_time, klc.cal_fx_strength(), klc.klc_fx_type, fx_list[-1], klc_strength_list[-1])
|
print(klc.start_time, klc.end_time, klc.cal_fx_strength(), klc.klc_fx_type, fx_list[-1], klc_strength_list[-1])
|
||||||
else:
|
else:
|
||||||
klc_strength_list.append(0)
|
klc_strength_list.append(0)
|
||||||
fx_list.append(0)
|
fx_list.append(0)
|
||||||
|
|||||||
@@ -30,13 +30,13 @@ class ChanPY():
|
|||||||
k_type = KL_TYPE.K_5M
|
k_type = KL_TYPE.K_5M
|
||||||
config = CChanConfig({
|
config = CChanConfig({
|
||||||
"bi_strict": True,
|
"bi_strict": True,
|
||||||
"bi_algo": "fx",
|
"bi_algo": "normal",
|
||||||
"trigger_step": True,
|
"trigger_step": True,
|
||||||
"skip_step": 0,
|
"skip_step": 0,
|
||||||
"divergence_rate": 0.9,
|
"divergence_rate": float("inf"),
|
||||||
"bsp2_follow_1": False,
|
"bsp2_follow_1": False,
|
||||||
"bsp3_follow_1": False,
|
"bsp3_follow_1": False,
|
||||||
"min_zs_cnt": 1,
|
"min_zs_cnt": 0,
|
||||||
"bs1_peak": False,
|
"bs1_peak": False,
|
||||||
"macd_algo": "peak",
|
"macd_algo": "peak",
|
||||||
"bs_type": '1,2,3a,1p,2s,3b',
|
"bs_type": '1,2,3a,1p,2s,3b',
|
||||||
@@ -61,7 +61,7 @@ class ChanPY():
|
|||||||
self.chan.trigger_load({self.k_type: [klu]})
|
self.chan.trigger_load({self.k_type: [klu]})
|
||||||
self.klu_list.append(klu)
|
self.klu_list.append(klu)
|
||||||
def add_klu_from_dataframe(self, dataframe):
|
def add_klu_from_dataframe(self, dataframe):
|
||||||
if len(dataframe) > len(self.klu_list):
|
if len(dataframe) > len(self.klu_list) and len(dataframe) - len(self.klu_list) == 1:
|
||||||
klu = self.get_last_klu(dataframe)
|
klu = self.get_last_klu(dataframe)
|
||||||
self.chan.trigger_load({self.k_type: [klu]})
|
self.chan.trigger_load({self.k_type: [klu]})
|
||||||
self.klu_list.append(klu)
|
self.klu_list.append(klu)
|
||||||
@@ -166,6 +166,7 @@ class ChanPY():
|
|||||||
if bsp_type == BSP_TYPE.T3B:
|
if bsp_type == BSP_TYPE.T3B:
|
||||||
return -6
|
return -6
|
||||||
def get_bsps(self, dataframe:DataFrame):
|
def get_bsps(self, dataframe:DataFrame):
|
||||||
|
fields = "time,open,high,low,close,volume"
|
||||||
bsps = []
|
bsps = []
|
||||||
updown = []
|
updown = []
|
||||||
bi_sure = []
|
bi_sure = []
|
||||||
@@ -190,20 +191,23 @@ class ChanPY():
|
|||||||
last_bsp = bsp_list[-1]
|
last_bsp = bsp_list[-1]
|
||||||
#print(klu.time, klu.idx, last_bsp.klu.time, last_bsp.klu.idx, last_bsp_value, lst[-2].fx, bi_list[-1].dir, bi_list[-1].is_sure,klu.close)
|
#print(klu.time, klu.idx, last_bsp.klu.time, last_bsp.klu.idx, last_bsp_value, lst[-2].fx, bi_list[-1].dir, bi_list[-1].is_sure,klu.close)
|
||||||
if bsp_list_pre_len > len(bsp_list):
|
if bsp_list_pre_len > len(bsp_list):
|
||||||
|
if abs(last_bsp_value) == 1 or abs(last_bsp_value) == 2:
|
||||||
|
bsps.append(1)
|
||||||
|
print(klu.time, klu.idx, last_bsp.klu.time, last_bsp.klu.idx, last_bsp_value, 98)
|
||||||
|
else:
|
||||||
bsps.append(99)
|
bsps.append(99)
|
||||||
#print(klu.time, klu.idx, last_bsp.klu.time, last_bsp.klu.idx, last_bsp_value, 99)
|
|
||||||
else:
|
else:
|
||||||
if bsp_list_pre_len == len(bsp_list):
|
if bsp_list_pre_len == len(bsp_list):
|
||||||
if klu.idx == last_bsp.klu.idx:
|
if klu.idx == last_bsp.klu.idx:
|
||||||
last_bsp_value = self.get_bsp_type(last_bsp.type[0], last_bsp.is_buy)
|
last_bsp_value = self.get_bsp_type(last_bsp.type[0], last_bsp.is_buy)
|
||||||
bsps.append(last_bsp_value)
|
bsps.append(last_bsp_value)
|
||||||
#print(klu.time, klu.idx, last_bsp.klu.time, last_bsp.klu.idx, last_bsp_value)
|
print(klu.time, klu.idx, last_bsp.klu.time, last_bsp.klu.idx, last_bsp_value)
|
||||||
else:
|
else:
|
||||||
bsps.append(0)
|
bsps.append(0)
|
||||||
else:
|
else:
|
||||||
last_bsp_value = self.get_bsp_type(last_bsp.type[0], last_bsp.is_buy)
|
last_bsp_value = self.get_bsp_type(last_bsp.type[0], last_bsp.is_buy)
|
||||||
bsps.append(last_bsp_value)
|
bsps.append(last_bsp_value)
|
||||||
#print(klu.time, klu.idx, last_bsp.klu.time, last_bsp.klu.idx, last_bsp_value)
|
print(klu.time, klu.idx, last_bsp.klu.time, last_bsp.klu.idx, last_bsp_value)
|
||||||
else:
|
else:
|
||||||
bsps.append(0)
|
bsps.append(0)
|
||||||
bsp_list_pre_len = len(bsp_list)
|
bsp_list_pre_len = len(bsp_list)
|
||||||
@@ -266,9 +270,25 @@ class ChanPY():
|
|||||||
if self.last_kline.time < klu.time:
|
if self.last_kline.time < klu.time:
|
||||||
self.chan.trigger_load({self.k_type: [klu]}) # 喂给CChan新增k线
|
self.chan.trigger_load({self.k_type: [klu]}) # 喂给CChan新增k线
|
||||||
self.last_kline = klu
|
self.last_kline = klu
|
||||||
|
for index in range(0, len(bsps)):
|
||||||
|
if not (abs(bsps[index]) == 1 or abs(bsps[index]) == 2):
|
||||||
|
bsps[index] = 0
|
||||||
|
else:
|
||||||
|
if bsps[index] == 2:
|
||||||
|
bsps[index] = 1
|
||||||
|
else:
|
||||||
|
if bsps[index] == -2:
|
||||||
|
bsps[index] = -1
|
||||||
|
else:
|
||||||
|
bsps[index] = 0
|
||||||
#print(bsps)
|
#print(bsps)
|
||||||
#print(updown)
|
#print(updown)
|
||||||
kl_datas = self.chan.kl_datas[self.k_type]
|
kl_datas = self.chan.kl_datas[self.k_type]
|
||||||
#for zs in kl_datas.zs_list:
|
#for zs in kl_datas.zs_list:
|
||||||
#print(zs.begin.time, zs.end.time)
|
#print(zs.begin.time, zs.end.time)
|
||||||
return bsps, updown, bi_sure
|
return bsps, updown, bi_sure
|
||||||
|
def get_bsp_state(self, dataframe:DataFrame):
|
||||||
|
bsps, updown, bi_sure = self.get_bsps(dataframe)
|
||||||
|
#print(bsps)
|
||||||
|
return bsps
|
||||||
|
|
||||||
@@ -8,6 +8,7 @@ sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
|||||||
from ChanLun import ChanLun
|
from ChanLun import ChanLun
|
||||||
from ChanLun_Classifier import ChanLunClassifier
|
from ChanLun_Classifier import ChanLunClassifier
|
||||||
from ChanEnum import Chan_FX_TYPE, Chan_KLC_FX, Chan_BI_DIR, Chan_KLC_FX
|
from ChanEnum import Chan_FX_TYPE, Chan_KLC_FX, Chan_BI_DIR, Chan_KLC_FX
|
||||||
|
from ChanPY import ChanPY
|
||||||
# --------------------------------
|
# --------------------------------
|
||||||
from technical.util import resample_to_interval, resampled_merge
|
from technical.util import resample_to_interval, resampled_merge
|
||||||
import talib.abstract as ta
|
import talib.abstract as ta
|
||||||
@@ -61,7 +62,7 @@ class ChanLun_BTC_30(IStrategy):
|
|||||||
"3600": 0
|
"3600": 0
|
||||||
}
|
}
|
||||||
can_short = True
|
can_short = True
|
||||||
lev = 50.0
|
lev = 1.0
|
||||||
stoploss = -0.3
|
stoploss = -0.3
|
||||||
trailing_stop = False
|
trailing_stop = False
|
||||||
trailing_stop_positive = 0.025
|
trailing_stop_positive = 0.025
|
||||||
@@ -76,9 +77,9 @@ class ChanLun_BTC_30(IStrategy):
|
|||||||
time30 = 30
|
time30 = 30
|
||||||
time60 = 60
|
time60 = 60
|
||||||
time4h = 240
|
time4h = 240
|
||||||
time5 = 30
|
|
||||||
last_time = datetime.now()
|
last_time = datetime.now()
|
||||||
chan = ChanLun()
|
chan = ChanLun()
|
||||||
|
chanpy = ChanPY()
|
||||||
classifier = ChanLunClassifier(None)
|
classifier = ChanLunClassifier(None)
|
||||||
def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
|
def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
|
||||||
|
|
||||||
@@ -104,7 +105,7 @@ class ChanLun_BTC_30(IStrategy):
|
|||||||
dataframe_1d = self.add_indicators(dataframe_1d)
|
dataframe_1d = self.add_indicators(dataframe_1d)
|
||||||
#self.chan.plot_dual(dataframe_5, dataframe_30)
|
#self.chan.plot_dual(dataframe_5, dataframe_30)
|
||||||
dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14)
|
dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14)
|
||||||
|
dataframe_5['chanpy_state'] = self.chanpy.get_bsp_state(dataframe_5)
|
||||||
state_list, fx_list = self.chan.get_klc_strength_list(dataframe_30)
|
state_list, fx_list = self.chan.get_klc_strength_list(dataframe_30)
|
||||||
dataframe_30['state'] = state_list
|
dataframe_30['state'] = state_list
|
||||||
dataframe_30['fx'] = fx_list
|
dataframe_30['fx'] = fx_list
|
||||||
@@ -116,7 +117,7 @@ class ChanLun_BTC_30(IStrategy):
|
|||||||
print(klc_list[-1].klc_fx_type, klc_list[-2].klc_fx_type, klc_list[-3].klc_fx_type, klc_list[-4].klc_fx_type, klc_list[-5].klc_fx_type)
|
print(klc_list[-1].klc_fx_type, klc_list[-2].klc_fx_type, klc_list[-3].klc_fx_type, klc_list[-4].klc_fx_type, klc_list[-5].klc_fx_type)
|
||||||
print("-------------------------------------------------------------------------------")
|
print("-------------------------------------------------------------------------------")
|
||||||
self.last_time = datetime.now()
|
self.last_time = datetime.now()
|
||||||
#dataframe = resampled_merge(dataframe, dataframe_5)
|
dataframe = resampled_merge(dataframe, dataframe_5)
|
||||||
dataframe = resampled_merge(dataframe, dataframe_30)
|
dataframe = resampled_merge(dataframe, dataframe_30)
|
||||||
#dataframe = resampled_merge(dataframe, dataframe_30)
|
#dataframe = resampled_merge(dataframe, dataframe_30)
|
||||||
#dataframe = resampled_merge(dataframe, dataframe_60)
|
#dataframe = resampled_merge(dataframe, dataframe_60)
|
||||||
@@ -169,13 +170,16 @@ class ChanLun_BTC_30(IStrategy):
|
|||||||
return new_exitprice
|
return new_exitprice
|
||||||
|
|
||||||
def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
|
def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
|
||||||
state_str = 'resample_{}_state'.format(self.get_ticker_indicator()*self.time5)
|
state_str = 'resample_{}_state'.format(self.get_ticker_indicator()*self.time30)
|
||||||
fx_str = 'resample_{}_fx'.format(self.get_ticker_indicator()*self.time5)
|
fx_str = 'resample_{}_fx'.format(self.get_ticker_indicator()*self.time30)
|
||||||
|
chanpy_state_str = 'resample_{}_chanpy_state'.format(self.get_ticker_indicator()*self.time5)
|
||||||
|
shift_time = self.time30
|
||||||
dataframe.loc[
|
dataframe.loc[
|
||||||
(
|
(
|
||||||
#(dataframe['state'] == "-30")
|
#(dataframe['state'] == "-30")
|
||||||
(dataframe[state_str].shift(self.time5) > 1.0) &
|
(dataframe[state_str].shift(shift_time) > 1.0) &
|
||||||
(dataframe[fx_str].shift(self.time5) == -1)
|
(dataframe[fx_str].shift(shift_time) == -1) &
|
||||||
|
(dataframe[chanpy_state_str].shift(shift_time) == 1)
|
||||||
#(dataframe['resample_{}_state'.format(self.get_ticker_indicator()*self.time5)].shift(self.time5) == "-10") &
|
#(dataframe['resample_{}_state'.format(self.get_ticker_indicator()*self.time5)].shift(self.time5) == "-10") &
|
||||||
#(dataframe['resample_{}_state'.format(self.get_ticker_indicator()*self.time30)] == "-10") &
|
#(dataframe['resample_{}_state'.format(self.get_ticker_indicator()*self.time30)] == "-10") &
|
||||||
#(dataframe['resample_{}_state'.format(self.get_ticker_indicator()*self.time5)].shift(self.time5) == "-10")
|
#(dataframe['resample_{}_state'.format(self.get_ticker_indicator()*self.time5)].shift(self.time5) == "-10")
|
||||||
@@ -185,8 +189,9 @@ class ChanLun_BTC_30(IStrategy):
|
|||||||
dataframe.loc[
|
dataframe.loc[
|
||||||
(
|
(
|
||||||
#(dataframe['state'] == "-30")
|
#(dataframe['state'] == "-30")
|
||||||
(dataframe[state_str].shift(self.time5) > 1.0) &
|
(dataframe[state_str].shift(shift_time) > 1.0) &
|
||||||
(dataframe[fx_str].shift(self.time5) == 1)
|
(dataframe[fx_str].shift(shift_time) == 1) &
|
||||||
|
(dataframe[chanpy_state_str].shift(shift_time) == -1)
|
||||||
#(dataframe['resample_{}_state'.format(self.get_ticker_indicator()*self.time5)].shift(self.time5) == "-10") &
|
#(dataframe['resample_{}_state'.format(self.get_ticker_indicator()*self.time5)].shift(self.time5) == "-10") &
|
||||||
#(dataframe['resample_{}_state'.format(self.get_ticker_indicator()*self.time30)] == "-10") &
|
#(dataframe['resample_{}_state'.format(self.get_ticker_indicator()*self.time30)] == "-10") &
|
||||||
#(dataframe['resample_{}_state'.format(self.get_ticker_indicator()*self.time5)].shift(self.time5) == "-10")
|
#(dataframe['resample_{}_state'.format(self.get_ticker_indicator()*self.time5)].shift(self.time5) == "-10")
|
||||||
@@ -195,13 +200,16 @@ class ChanLun_BTC_30(IStrategy):
|
|||||||
['enter_short', 'enter_tag']] = (1, 'short_signal_chan')
|
['enter_short', 'enter_tag']] = (1, 'short_signal_chan')
|
||||||
return dataframe
|
return dataframe
|
||||||
def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
|
def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
|
||||||
state_str = 'resample_{}_state'.format(self.get_ticker_indicator()*self.time5)
|
state_str = 'resample_{}_state'.format(self.get_ticker_indicator()*self.time30)
|
||||||
fx_str = 'resample_{}_fx'.format(self.get_ticker_indicator()*self.time5)
|
fx_str = 'resample_{}_fx'.format(self.get_ticker_indicator()*self.time30)
|
||||||
|
chanpy_state_str = 'resample_{}_chanpy_state'.format(self.get_ticker_indicator()*self.time5)
|
||||||
|
shift_time = self.time30
|
||||||
dataframe.loc[
|
dataframe.loc[
|
||||||
(
|
(
|
||||||
#(dataframe['state']== "30")
|
#(dataframe['state']== "30")
|
||||||
(dataframe[state_str].shift(self.time5) > 1.0) &
|
(dataframe[state_str].shift(shift_time) > 1.0) &
|
||||||
(dataframe[fx_str].shift(self.time5) == 1)
|
(dataframe[fx_str].shift(shift_time) == 1) &
|
||||||
|
(dataframe[chanpy_state_str].shift(shift_time) == -1)
|
||||||
#(dataframe['resample_{}_state'.format(self.get_ticker_indicator()*self.time30)] == "10") &
|
#(dataframe['resample_{}_state'.format(self.get_ticker_indicator()*self.time30)] == "10") &
|
||||||
#(dataframe['resample_{}_state'.format(self.get_ticker_indicator()*self.time60)] == "10")
|
#(dataframe['resample_{}_state'.format(self.get_ticker_indicator()*self.time60)] == "10")
|
||||||
),
|
),
|
||||||
@@ -209,8 +217,9 @@ class ChanLun_BTC_30(IStrategy):
|
|||||||
dataframe.loc[
|
dataframe.loc[
|
||||||
(
|
(
|
||||||
#(dataframe['state']== "30")
|
#(dataframe['state']== "30")
|
||||||
(dataframe[state_str].shift(self.time5) > 1.0) &
|
(dataframe[state_str].shift(shift_time) > 1.0) &
|
||||||
(dataframe[fx_str].shift(self.time5) == -1)
|
(dataframe[fx_str].shift(shift_time) == -1) &
|
||||||
|
(dataframe[chanpy_state_str].shift(shift_time) == 1)
|
||||||
#(dataframe['resample_{}_state'.format(self.get_ticker_indicator()*self.time30)] == "10") &
|
#(dataframe['resample_{}_state'.format(self.get_ticker_indicator()*self.time30)] == "10") &
|
||||||
#(dataframe['resample_{}_state'.format(self.get_ticker_indicator()*self.time60)] == "10")
|
#(dataframe['resample_{}_state'.format(self.get_ticker_indicator()*self.time60)] == "10")
|
||||||
),
|
),
|
||||||
|
|||||||
Reference in New Issue
Block a user