brain stra removed, branch renamed,min roi added
This commit is contained in:
@@ -72,9 +72,11 @@ all_god_genes = {
|
||||
'PLUS_DM', # Plus Directional Movement
|
||||
'PPO', # Percentage Price Oscillator
|
||||
'ROC', # Rate of change : ((price/prevPrice)-1)*100
|
||||
'ROCP', # Rate of change Percentage: (price-prevPrice)/prevPrice
|
||||
# Rate of change Percentage: (price-prevPrice)/prevPrice
|
||||
'ROCP',
|
||||
'ROCR', # Rate of change ratio: (price/prevPrice)
|
||||
'ROCR100', # Rate of change ratio 100 scale: (price/prevPrice)*100
|
||||
# Rate of change ratio 100 scale: (price/prevPrice)*100
|
||||
'ROCR100',
|
||||
'RSI', # Relative Strength Index
|
||||
'STOCH-0', # Stochastic
|
||||
'STOCH-1', # Stochastic
|
||||
@@ -82,7 +84,8 @@ all_god_genes = {
|
||||
'STOCHF-1', # Stochastic Fast
|
||||
'STOCHRSI-0', # Stochastic Relative Strength Index
|
||||
'STOCHRSI-1', # Stochastic Relative Strength Index
|
||||
'TRIX', # 1-day Rate-Of-Change (ROC) of a Triple Smooth EMA
|
||||
# 1-day Rate-Of-Change (ROC) of a Triple Smooth EMA
|
||||
'TRIX',
|
||||
'ULTOSC', # Ultimate Oscillator
|
||||
'WILLR', # Williams' %R
|
||||
},
|
||||
@@ -166,7 +169,8 @@ all_god_genes = {
|
||||
'CDLSPINNINGTOP', # Spinning Top
|
||||
'CDLSTALLEDPATTERN', # Stalled Pattern
|
||||
'CDLSTICKSANDWICH', # Stick Sandwich
|
||||
'CDLTAKURI', # Takuri (Dragonfly Doji with very long lower shadow)
|
||||
# Takuri (Dragonfly Doji with very long lower shadow)
|
||||
'CDLTAKURI',
|
||||
'CDLTASUKIGAP', # Tasuki Gap
|
||||
'CDLTHRUSTING', # Thrusting Pattern
|
||||
'CDLTRISTAR', # Tristar Pattern
|
||||
@@ -191,15 +195,15 @@ all_god_genes = {
|
||||
god_genes = set()
|
||||
########################### SETTINGS ##############################
|
||||
|
||||
god_genes = {'SMA'}
|
||||
# god_genes |= all_god_genes['Overlap Studies']
|
||||
# god_genes |= all_god_genes['Momentum Indicators']
|
||||
# god_genes |= all_god_genes['Volume Indicators']
|
||||
# god_genes |= all_god_genes['Volatility Indicators']
|
||||
# god_genes |= all_god_genes['Price Transform']
|
||||
# god_genes |= all_god_genes['Cycle Indicators']
|
||||
# god_genes |= all_god_genes['Pattern Recognition']
|
||||
# god_genes |= all_god_genes['Statistic Functions']
|
||||
# god_genes = {'SMA'}
|
||||
god_genes |= all_god_genes['Overlap Studies']
|
||||
god_genes |= all_god_genes['Momentum Indicators']
|
||||
god_genes |= all_god_genes['Volume Indicators']
|
||||
god_genes |= all_god_genes['Volatility Indicators']
|
||||
god_genes |= all_god_genes['Price Transform']
|
||||
god_genes |= all_god_genes['Cycle Indicators']
|
||||
god_genes |= all_god_genes['Pattern Recognition']
|
||||
god_genes |= all_god_genes['Statistic Functions']
|
||||
|
||||
timeperiods = [5, 6, 12, 15, 50, 55, 100, 110]
|
||||
operators = [
|
||||
@@ -328,11 +332,13 @@ def condition_generator(dataframe, operator, indicator, crossed_indicator, real_
|
||||
# TODO : it ill callculated in populate indicators.
|
||||
|
||||
dataframe[indicator] = gene_calculator(dataframe, indicator)
|
||||
dataframe[crossed_indicator] = gene_calculator(dataframe, crossed_indicator)
|
||||
dataframe[crossed_indicator] = gene_calculator(
|
||||
dataframe, crossed_indicator)
|
||||
|
||||
indicator_trend_sma = f"{indicator}-SMA-{TREND_CHECK_CANDLES}"
|
||||
if operator in ["UT", "DT", "OT", "CUT", "CDT", "COT"]:
|
||||
dataframe[indicator_trend_sma] = gene_calculator(dataframe, indicator_trend_sma)
|
||||
dataframe[indicator_trend_sma] = gene_calculator(
|
||||
dataframe, indicator_trend_sma)
|
||||
|
||||
if operator == ">":
|
||||
condition = (
|
||||
@@ -349,11 +355,13 @@ def condition_generator(dataframe, operator, indicator, crossed_indicator, real_
|
||||
elif operator == "C":
|
||||
condition = (
|
||||
(qtpylib.crossed_below(dataframe[indicator], dataframe[crossed_indicator])) |
|
||||
(qtpylib.crossed_above(dataframe[indicator], dataframe[crossed_indicator]))
|
||||
(qtpylib.crossed_above(
|
||||
dataframe[indicator], dataframe[crossed_indicator]))
|
||||
)
|
||||
elif operator == "CA":
|
||||
condition = (
|
||||
qtpylib.crossed_above(dataframe[indicator], dataframe[crossed_indicator])
|
||||
qtpylib.crossed_above(
|
||||
dataframe[indicator], dataframe[crossed_indicator])
|
||||
)
|
||||
elif operator == "CB":
|
||||
condition = (
|
||||
@@ -378,7 +386,8 @@ def condition_generator(dataframe, operator, indicator, crossed_indicator, real_
|
||||
)
|
||||
elif operator == "/=R":
|
||||
condition = (
|
||||
np.isclose(dataframe[indicator].div(dataframe[crossed_indicator]), real_num)
|
||||
np.isclose(dataframe[indicator].div(
|
||||
dataframe[crossed_indicator]), real_num)
|
||||
)
|
||||
elif operator == "/<R":
|
||||
condition = (
|
||||
@@ -450,6 +459,18 @@ def condition_generator(dataframe, operator, indicator, crossed_indicator, real_
|
||||
|
||||
class GodStraNew(IStrategy):
|
||||
# #################### RESULTS PASTE PLACE ####################
|
||||
# ROI table:
|
||||
minimal_roi = {
|
||||
"0": 0.598,
|
||||
"644": 0.166,
|
||||
"3269": 0.115,
|
||||
"7289": 0
|
||||
}
|
||||
|
||||
# Stoploss:
|
||||
stoploss = -0.128
|
||||
# Buy hypers
|
||||
timeframe = '4h'
|
||||
|
||||
# #################### END OF RESULT PLACE ####################
|
||||
|
||||
@@ -473,9 +494,12 @@ class GodStraNew(IStrategy):
|
||||
buy_operator1 = CategoricalParameter(operators, default="<R", space='buy')
|
||||
buy_operator2 = CategoricalParameter(operators, default="CB", space='buy')
|
||||
|
||||
buy_real_num0 = DecimalParameter(0, 1, decimals=DECIMALS, default=0.89009, space='buy')
|
||||
buy_real_num1 = DecimalParameter(0, 1, decimals=DECIMALS, default=0.56953, space='buy')
|
||||
buy_real_num2 = DecimalParameter(0, 1, decimals=DECIMALS, default=0.38365, space='buy')
|
||||
buy_real_num0 = DecimalParameter(
|
||||
0, 1, decimals=DECIMALS, default=0.89009, space='buy')
|
||||
buy_real_num1 = DecimalParameter(
|
||||
0, 1, decimals=DECIMALS, default=0.56953, space='buy')
|
||||
buy_real_num2 = DecimalParameter(
|
||||
0, 1, decimals=DECIMALS, default=0.38365, space='buy')
|
||||
|
||||
# Sell Hyperoptable Parameters/Spaces.
|
||||
sell_crossed_indicator0 = CategoricalParameter(
|
||||
@@ -492,18 +516,18 @@ class GodStraNew(IStrategy):
|
||||
sell_indicator2 = CategoricalParameter(
|
||||
god_genes_with_timeperiod, default="CDL2CROWS-5", space='sell')
|
||||
|
||||
sell_operator0 = CategoricalParameter(operators, default="<R", space='sell')
|
||||
sell_operator0 = CategoricalParameter(
|
||||
operators, default="<R", space='sell')
|
||||
sell_operator1 = CategoricalParameter(operators, default="D", space='sell')
|
||||
sell_operator2 = CategoricalParameter(operators, default="/>R", space='sell')
|
||||
sell_operator2 = CategoricalParameter(
|
||||
operators, default="/>R", space='sell')
|
||||
|
||||
sell_real_num0 = DecimalParameter(0, 1, decimals=DECIMALS, default=0.09731, space='sell')
|
||||
sell_real_num1 = DecimalParameter(0, 1, decimals=DECIMALS, default=0.81657, space='sell')
|
||||
sell_real_num2 = DecimalParameter(0, 1, decimals=DECIMALS, default=0.87267, space='sell')
|
||||
|
||||
# Stoploss:
|
||||
stoploss = -1
|
||||
# Buy hypers
|
||||
timeframe = '4h'
|
||||
sell_real_num0 = DecimalParameter(
|
||||
0, 1, decimals=DECIMALS, default=0.09731, space='sell')
|
||||
sell_real_num1 = DecimalParameter(
|
||||
0, 1, decimals=DECIMALS, default=0.81657, space='sell')
|
||||
sell_real_num2 = DecimalParameter(
|
||||
0, 1, decimals=DECIMALS, default=0.87267, space='sell')
|
||||
|
||||
def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
|
||||
'''
|
||||
|
||||
@@ -36,13 +36,13 @@ class MultiMa(IStrategy):
|
||||
}
|
||||
|
||||
# Stoploss:
|
||||
stoploss = -0.1
|
||||
stoploss = -0.128
|
||||
|
||||
# Buy hypers
|
||||
timeframe = '4h'
|
||||
|
||||
def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
|
||||
|
||||
|
||||
# We will dinamicly generate the indicators
|
||||
# cuz this method just run one time in hyperopts
|
||||
# if you have static timeframes you can move first loop of buy and sell trends populators inside this method
|
||||
@@ -50,11 +50,11 @@ class MultiMa(IStrategy):
|
||||
return dataframe
|
||||
|
||||
def populate_buy_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
|
||||
|
||||
|
||||
for i in self.buy_ma_count.range:
|
||||
dataframe[f'buy-ma-{i+1}'] = ta.SMA(dataframe,
|
||||
timeperiod=int((i+1) * self.buy_ma_gap.value))
|
||||
|
||||
timeperiod=int((i+1) * self.buy_ma_gap.value))
|
||||
|
||||
conditions = []
|
||||
|
||||
for i in self.buy_ma_count.range:
|
||||
@@ -75,7 +75,7 @@ class MultiMa(IStrategy):
|
||||
def populate_sell_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
|
||||
for i in self.sell_ma_count.range:
|
||||
dataframe[f'sell-ma-{i+1}'] = ta.SMA(dataframe,
|
||||
timeperiod=int((i+1) * self.sell_ma_gap.value))
|
||||
timeperiod=int((i+1) * self.sell_ma_gap.value))
|
||||
|
||||
conditions = []
|
||||
|
||||
|
||||
@@ -1,559 +0,0 @@
|
||||
# QBitrain Strategy QBit + Brain + train
|
||||
# The idea is that some neurons of a brain connecting to each other to make a sum of
|
||||
# numbers that help to make decisions to buy and sell.Mixed With Quantum Bits State!
|
||||
# That multiple with the neuron value to change the neuron data to a wighted data.
|
||||
# -1 is fully reversed, 0 means fully disabled, 1 is fully active.
|
||||
# but its a range between -1 to 1 like quantum state of the particles!
|
||||
# Author: @Mablue (Masoud Azizi)
|
||||
# github: https://github.com/mablue/
|
||||
# freqtrade hyperopt --hyperopt-loss SharpeHyperOptLoss --spaces buy roi trailing sell --strategy QBitrain
|
||||
# --- Do not remove these libs ---
|
||||
# from freqtrade import data
|
||||
from freqtrade.strategy.hyper import CategoricalParameter, DecimalParameter, IntParameter
|
||||
|
||||
# from numpy.lib import math
|
||||
from freqtrade.strategy.interface import IStrategy
|
||||
from pandas import DataFrame
|
||||
|
||||
# --------------------------------
|
||||
|
||||
# Add your lib to import here
|
||||
# TODO: talib is fast but have not more indicators
|
||||
import talib.abstract as ta
|
||||
from functools import reduce
|
||||
# TODO: this gene is removed 'MAVP' cuz or error on periods
|
||||
AllLearntKnowledges = {
|
||||
'Overlap Studies': {
|
||||
'BBANDS-0', # Bollinger Bands
|
||||
'BBANDS-1', # Bollinger Bands
|
||||
'BBANDS-2', # Bollinger Bands
|
||||
'DEMA', # Double Exponential Moving Average
|
||||
'EMA', # Exponential Moving Average
|
||||
'HT_TRENDLINE', # Hilbert Transform - Instantaneous Trendline
|
||||
'KAMA', # Kaufman Adaptive Moving Average
|
||||
'MA', # Moving average
|
||||
'MAMA-0', # MESA Adaptive Moving Average
|
||||
'MAMA-1', # MESA Adaptive Moving Average
|
||||
# TODO: Fix this
|
||||
# 'MAVP', # Moving average with variable period
|
||||
'MIDPOINT', # MidPoint over period
|
||||
'MIDPRICE', # Midpoint Price over period
|
||||
'SAR', # Parabolic SAR
|
||||
'SAREXT', # Parabolic SAR - Extended
|
||||
'SMA', # Simple Moving Average
|
||||
'T3', # Triple Exponential Moving Average (T3)
|
||||
'TEMA', # Triple Exponential Moving Average
|
||||
'TRIMA', # Triangular Moving Average
|
||||
'WMA', # Weighted Moving Average
|
||||
},
|
||||
'Momentum Indicators': {
|
||||
'ADX', # Average Directional Movement Index
|
||||
'ADXR', # Average Directional Movement Index Rating
|
||||
'APO', # Absolute Price Oscillator
|
||||
'AROON-0', # Aroon
|
||||
'AROON-1', # Aroon
|
||||
'AROONOSC', # Aroon Oscillator
|
||||
'BOP', # Balance Of Power
|
||||
'CCI', # Commodity Channel Index
|
||||
'CMO', # Chande Momentum Oscillator
|
||||
'DX', # Directional Movement Index
|
||||
'MACD-0', # Moving Average Convergence/Divergence
|
||||
'MACD-1', # Moving Average Convergence/Divergence
|
||||
'MACD-2', # Moving Average Convergence/Divergence
|
||||
'MACDEXT-0', # MACD with controllable MA type
|
||||
'MACDEXT-1', # MACD with controllable MA type
|
||||
'MACDEXT-2', # MACD with controllable MA type
|
||||
'MACDFIX-0', # Moving Average Convergence/Divergence Fix 12/26
|
||||
'MACDFIX-1', # Moving Average Convergence/Divergence Fix 12/26
|
||||
'MACDFIX-2', # Moving Average Convergence/Divergence Fix 12/26
|
||||
'MFI', # Money Flow Index
|
||||
'MINUS_DI', # Minus Directional Indicator
|
||||
'MINUS_DM', # Minus Directional Movement
|
||||
'MOM', # Momentum
|
||||
'PLUS_DI', # Plus Directional Indicator
|
||||
'PLUS_DM', # Plus Directional Movement
|
||||
'PPO', # Percentage Price Oscillator
|
||||
'ROC', # Rate of change : ((price/prevPrice)-1)*100
|
||||
# Rate of change Percentage: (price-prevPrice)/prevPrice
|
||||
'ROCP',
|
||||
'ROCR', # Rate of change ratio: (price/prevPrice)
|
||||
# Rate of change ratio 100 scale: (price/prevPrice)*100
|
||||
'ROCR100',
|
||||
'RSI', # Relative Strength Index
|
||||
'STOCH-0', # Stochastic
|
||||
'STOCH-1', # Stochastic
|
||||
'STOCHF-0', # Stochastic Fast
|
||||
'STOCHF-1', # Stochastic Fast
|
||||
'STOCHRSI-0', # Stochastic Relative Strength Index
|
||||
'STOCHRSI-1', # Stochastic Relative Strength Index
|
||||
# 1-day Rate-Of-Change (ROC) of a Triple Smooth EMA
|
||||
'TRIX',
|
||||
'ULTOSC', # Ultimate Oscillator
|
||||
'WILLR', # Williams' %R
|
||||
},
|
||||
'Volume Indicators': {
|
||||
'AD', # Chaikin A/D Line
|
||||
'ADOSC', # Chaikin A/D Oscillator
|
||||
'OBV', # On Balance Volume
|
||||
},
|
||||
'Volatility Indicators': {
|
||||
'ATR', # Average True Range
|
||||
'NATR', # Normalized Average True Range
|
||||
'TRANGE', # True Range
|
||||
},
|
||||
'Price Transform': {
|
||||
'AVGPRICE', # Average Price
|
||||
'MEDPRICE', # Median Price
|
||||
'TYPPRICE', # Typical Price
|
||||
'WCLPRICE', # Weighted Close Price
|
||||
},
|
||||
'Cycle Indicators': {
|
||||
'HT_DCPERIOD', # Hilbert Transform - Dominant Cycle Period
|
||||
'HT_DCPHASE', # Hilbert Transform - Dominant Cycle Phase
|
||||
'HT_PHASOR-0', # Hilbert Transform - Phasor Components
|
||||
'HT_PHASOR-1', # Hilbert Transform - Phasor Components
|
||||
'HT_SINE-0', # Hilbert Transform - SineWave
|
||||
'HT_SINE-1', # Hilbert Transform - SineWave
|
||||
'HT_TRENDMODE', # Hilbert Transform - Trend vs Cycle Mode
|
||||
},
|
||||
'Pattern Recognition': {
|
||||
'CDL2CROWS', # Two Crows
|
||||
'CDL3BLACKCROWS', # Three Black Crows
|
||||
'CDL3INSIDE', # Three Inside Up/Down
|
||||
'CDL3LINESTRIKE', # Three-Line Strike
|
||||
'CDL3OUTSIDE', # Three Outside Up/Down
|
||||
'CDL3STARSINSOUTH', # Three Stars In The South
|
||||
'CDL3WHITESOLDIERS', # Three Advancing White Soldiers
|
||||
'CDLABANDONEDBABY', # Abandoned Baby
|
||||
'CDLADVANCEBLOCK', # Advance Block
|
||||
'CDLBELTHOLD', # Belt-hold
|
||||
'CDLBREAKAWAY', # Breakaway
|
||||
'CDLCLOSINGMARUBOZU', # Closing Marubozu
|
||||
'CDLCONCEALBABYSWALL', # Concealing Baby Swallow
|
||||
'CDLCOUNTERATTACK', # Counterattack
|
||||
'CDLDARKCLOUDCOVER', # Dark Cloud Cover
|
||||
'CDLDOJI', # Doji
|
||||
'CDLDOJISTAR', # Doji Star
|
||||
'CDLDRAGONFLYDOJI', # Dragonfly Doji
|
||||
'CDLENGULFING', # Engulfing Pattern
|
||||
'CDLEVENINGDOJISTAR', # Evening Doji Star
|
||||
'CDLEVENINGSTAR', # Evening Star
|
||||
'CDLGAPSIDESIDEWHITE', # Up/Down-gap side-by-side white lines
|
||||
'CDLGRAVESTONEDOJI', # Gravestone Doji
|
||||
'CDLHAMMER', # Hammer
|
||||
'CDLHANGINGMAN', # Hanging Man
|
||||
'CDLHARAMI', # Harami Pattern
|
||||
'CDLHARAMICROSS', # Harami Cross Pattern
|
||||
'CDLHIGHWAVE', # High-Wave Candle
|
||||
'CDLHIKKAKE', # Hikkake Pattern
|
||||
'CDLHIKKAKEMOD', # Modified Hikkake Pattern
|
||||
'CDLHOMINGPIGEON', # Homing Pigeon
|
||||
'CDLIDENTICAL3CROWS', # Identical Three Crows
|
||||
'CDLINNECK', # In-Neck Pattern
|
||||
'CDLINVERTEDHAMMER', # Inverted Hammer
|
||||
'CDLKICKING', # Kicking
|
||||
'CDLKICKINGBYLENGTH', # Kicking - bull/bear determined by the longer marubozu
|
||||
'CDLLADDERBOTTOM', # Ladder Bottom
|
||||
'CDLLONGLEGGEDDOJI', # Long Legged Doji
|
||||
'CDLLONGLINE', # Long Line Candle
|
||||
'CDLMARUBOZU', # Marubozu
|
||||
'CDLMATCHINGLOW', # Matching Low
|
||||
'CDLMATHOLD', # Mat Hold
|
||||
'CDLMORNINGDOJISTAR', # Morning Doji Star
|
||||
'CDLMORNINGSTAR', # Morning Star
|
||||
'CDLONNECK', # On-Neck Pattern
|
||||
'CDLPIERCING', # Piercing Pattern
|
||||
'CDLRICKSHAWMAN', # Rickshaw Man
|
||||
'CDLRISEFALL3METHODS', # Rising/Falling Three Methods
|
||||
'CDLSEPARATINGLINES', # Separating Lines
|
||||
'CDLSHOOTINGSTAR', # Shooting Star
|
||||
'CDLSHORTLINE', # Short Line Candle
|
||||
'CDLSPINNINGTOP', # Spinning Top
|
||||
'CDLSTALLEDPATTERN', # Stalled Pattern
|
||||
'CDLSTICKSANDWICH', # Stick Sandwich
|
||||
# Takuri (Dragonfly Doji with very long lower shadow)
|
||||
'CDLTAKURI',
|
||||
'CDLTASUKIGAP', # Tasuki Gap
|
||||
'CDLTHRUSTING', # Thrusting Pattern
|
||||
'CDLTRISTAR', # Tristar Pattern
|
||||
'CDLUNIQUE3RIVER', # Unique 3 River
|
||||
'CDLUPSIDEGAP2CROWS', # Upside Gap Two Crows
|
||||
'CDLXSIDEGAP3METHODS', # Upside/Downside Gap Three Methods
|
||||
|
||||
},
|
||||
'Statistic Functions': {
|
||||
'BETA', # Beta
|
||||
'CORREL', # Pearson's Correlation Coefficient (r)
|
||||
'LINEARREG', # Linear Regression
|
||||
'LINEARREG_ANGLE', # Linear Regression Angle
|
||||
'LINEARREG_INTERCEPT', # Linear Regression Intercept
|
||||
'LINEARREG_SLOPE', # Linear Regression Slope
|
||||
'STDDEV', # Standard Deviation
|
||||
'TSF', # Time Series Forecast
|
||||
'VAR', # Variance
|
||||
}
|
||||
|
||||
}
|
||||
LearntKnowledges = set()
|
||||
########################### SETTINGS ##############################
|
||||
|
||||
# LearntKnowledges = {'ADX', 'MOM', 'PLUS_DI', 'PLUS_DM'}
|
||||
LearntKnowledges |= AllLearntKnowledges['Overlap Studies']
|
||||
LearntKnowledges |= AllLearntKnowledges['Momentum Indicators']
|
||||
LearntKnowledges |= AllLearntKnowledges['Volume Indicators']
|
||||
LearntKnowledges |= AllLearntKnowledges['Volatility Indicators']
|
||||
LearntKnowledges |= AllLearntKnowledges['Price Transform']
|
||||
LearntKnowledges |= AllLearntKnowledges['Cycle Indicators']
|
||||
LearntKnowledges |= AllLearntKnowledges['Pattern Recognition']
|
||||
LearntKnowledges |= AllLearntKnowledges['Statistic Functions']
|
||||
|
||||
timeperiods = [6, 12, 24]
|
||||
# timeperiods = [10, 12, 15]
|
||||
|
||||
# number of candles to check up,don,off trend.
|
||||
TREND_CHECK_CANDLES = 4
|
||||
DECIMALS = 2
|
||||
# will use it without sell in hyperopt:
|
||||
# dualfit is fast but just uses buy params for both buy and sell
|
||||
DUALFIT = False
|
||||
########################### END SETTINGS ##########################
|
||||
# DATAFRAME = DataFrame()
|
||||
|
||||
LearntKnowledges = list(LearntKnowledges)
|
||||
# print('selected indicators for optimzatin: \n', LearntKnowledges)
|
||||
|
||||
LearntKnowledges_with_timeperiod = list()
|
||||
for LearntKnowledge in LearntKnowledges:
|
||||
for timeperiod in timeperiods:
|
||||
LearntKnowledges_with_timeperiod.append(
|
||||
f'{LearntKnowledge}-{timeperiod}')
|
||||
|
||||
# Let give somethings to CatagoricalParam to Play with them
|
||||
# When just one thing is inside catagorical lists
|
||||
# TODO: its Not True Way :)
|
||||
if len(LearntKnowledges) == 1:
|
||||
LearntKnowledges = LearntKnowledges*2
|
||||
if len(timeperiods) == 1:
|
||||
timeperiods = timeperiods*2
|
||||
|
||||
|
||||
def knowledge_calculator(dataframe, indicator):
|
||||
# Cuz Timeperiods not effect calculating CDL patterns recognations
|
||||
# TODO: I think I'm wrong!:S Timeperiods will effect cuz chart shape is changing when TP changes!
|
||||
# but it make the algo very fast and I cheked, this make good results!! :S
|
||||
if 'CDL' in indicator:
|
||||
splited_indicator = indicator.split('-')
|
||||
splited_indicator[1] = "0"
|
||||
new_indicator = "-".join(splited_indicator)
|
||||
# print(indicator, new_indicator)
|
||||
indicator = new_indicator
|
||||
|
||||
knowledge = indicator.split("-")
|
||||
|
||||
knowledge_name = knowledge[0]
|
||||
knowledge_len = len(knowledge)
|
||||
|
||||
if indicator in dataframe.keys():
|
||||
# print(f"{indicator}, calculated befoure")
|
||||
# print(len(dataframe.keys()))
|
||||
return dataframe[indicator]
|
||||
else:
|
||||
result = None
|
||||
# For Pattern Recognations
|
||||
if knowledge_len == 1:
|
||||
# print('knowledge_len == 1\t', indicator)
|
||||
result = getattr(ta, knowledge_name)(
|
||||
dataframe
|
||||
)
|
||||
return result
|
||||
elif knowledge_len == 2:
|
||||
# print('knowledge_len == 2\t', indicator)
|
||||
knowledge_timeperiod = int(knowledge[1])
|
||||
result = getattr(ta, knowledge_name)(
|
||||
dataframe,
|
||||
timeperiod=knowledge_timeperiod,
|
||||
)
|
||||
return result
|
||||
# For
|
||||
elif knowledge_len == 3:
|
||||
# print('knowledge_len == 3\t', indicator)
|
||||
knowledge_timeperiod = int(knowledge[2])
|
||||
knowledge_index = int(knowledge[1])
|
||||
result = getattr(ta, knowledge_name)(
|
||||
dataframe,
|
||||
timeperiod=knowledge_timeperiod,
|
||||
).iloc[:, knowledge_index]
|
||||
return result
|
||||
# For trend operators(MA-5-SMA-4)
|
||||
elif knowledge_len == 4:
|
||||
# print('knowledge_len == 4\t', indicator)
|
||||
knowledge_timeperiod = int(knowledge[1])
|
||||
sharp_indicator = f'{knowledge_name}-{knowledge_timeperiod}'
|
||||
dataframe[sharp_indicator] = getattr(ta, knowledge_name)(
|
||||
dataframe,
|
||||
timeperiod=knowledge_timeperiod,
|
||||
)
|
||||
return ta.SMA(dataframe[sharp_indicator].fillna(0), TREND_CHECK_CANDLES)
|
||||
# For trend operators(STOCH-0-4-SMA-4)
|
||||
elif knowledge_len == 5:
|
||||
# print('knowledge_len == 5\t', indicator)
|
||||
knowledge_timeperiod = int(knowledge[2])
|
||||
knowledge_index = int(knowledge[1])
|
||||
sharp_indicator = f'{knowledge_name}-{knowledge_index}-{knowledge_timeperiod}'
|
||||
dataframe[sharp_indicator] = getattr(ta, knowledge_name)(
|
||||
dataframe,
|
||||
timeperiod=knowledge_timeperiod,
|
||||
).iloc[:, knowledge_index]
|
||||
return ta.SMA(dataframe[sharp_indicator].fillna(0), TREND_CHECK_CANDLES)
|
||||
|
||||
# OK. Dont worry!! its used in end result
|
||||
|
||||
|
||||
def normalize(df):
|
||||
df = 2*(df-df.min())/(df.max()-df.min()) - 1
|
||||
return df
|
||||
|
||||
|
||||
class QBitrain(IStrategy):
|
||||
# #################### RESULTS LearntE PLACE ##################
|
||||
# * 22/100: 16 trades. 13/3/0 Wins/Draws/Losses. Avg profit 4.92%. Median profit 4.31%. Total profit 0.26254039 BTC ( 26.25Σ%). Avg duration 1 day, 14:00:00 min. Objective: -21.56636
|
||||
# Buy hyperspace params:
|
||||
buy_params = {
|
||||
"buy_indicator_0": "CDLTRISTAR-24",
|
||||
"buy_indicator_1": "CDLEVENINGDOJISTAR-12",
|
||||
"buy_indicator_2": "MACD-2-12",
|
||||
"buy_indicator_3": "STOCH-1-12",
|
||||
"buy_indicator_4": "PPO-6",
|
||||
"buy_indicator_5": "MOM-6",
|
||||
"buy_node_quantum_state_0": -0.5,
|
||||
"buy_node_quantum_state_1": -0.24,
|
||||
"buy_node_quantum_state_2": 0.51,
|
||||
"buy_node_quantum_state_3": -0.27,
|
||||
"buy_node_quantum_state_4": 0.35,
|
||||
"buy_node_quantum_state_5": 0.99,
|
||||
}
|
||||
|
||||
# Sell hyperspace params:
|
||||
sell_params = {
|
||||
"sell_indicator_0": "BBANDS-2-6",
|
||||
"sell_indicator_1": "EMA-24",
|
||||
"sell_indicator_2": "BBANDS-2-12",
|
||||
"sell_indicator_3": "BBANDS-0-24",
|
||||
"sell_indicator_4": "MACD-1-12",
|
||||
"sell_indicator_5": "HT_PHASOR-1-12",
|
||||
"sell_node_quantum_state_0": -0.15,
|
||||
"sell_node_quantum_state_1": -0.4,
|
||||
"sell_node_quantum_state_2": -0.56,
|
||||
"sell_node_quantum_state_3": -0.64,
|
||||
"sell_node_quantum_state_4": 0.64,
|
||||
"sell_node_quantum_state_5": 0.36,
|
||||
}
|
||||
|
||||
# ROI table:
|
||||
minimal_roi = {
|
||||
"0": 0.636,
|
||||
"1133": 0.112,
|
||||
"2179": 0.049,
|
||||
"4307": 0
|
||||
}
|
||||
|
||||
# Stoploss:
|
||||
stoploss = -0.256
|
||||
# #################### END OF RESULT PLACE ####################
|
||||
timeframe = '5m'
|
||||
|
||||
# TODO: Its not dry code!
|
||||
# Buy Hyperoptable Parameters/Spaces.
|
||||
# #########################################################
|
||||
buy_indicator_0 = CategoricalParameter(
|
||||
LearntKnowledges_with_timeperiod, default="CDLTRISTAR-24", space='buy')
|
||||
buy_indicator_1 = CategoricalParameter(
|
||||
LearntKnowledges_with_timeperiod, default="CDLEVENINGDOJISTAR-12", space='buy')
|
||||
buy_indicator_2 = CategoricalParameter(
|
||||
LearntKnowledges_with_timeperiod, default="MACD-2-12", space='buy')
|
||||
buy_indicator_3 = CategoricalParameter(
|
||||
LearntKnowledges_with_timeperiod, default="STOCH-1-12", space='buy')
|
||||
buy_indicator_4 = CategoricalParameter(
|
||||
LearntKnowledges_with_timeperiod, default="PPO-6", space='buy')
|
||||
buy_indicator_5 = CategoricalParameter(
|
||||
LearntKnowledges_with_timeperiod, default="MOM-6", space='buy')
|
||||
|
||||
buy_node_quantum_state_0 = DecimalParameter(
|
||||
-1, 1, decimals=DECIMALS, default=-0.5, space='buy')
|
||||
buy_node_quantum_state_1 = DecimalParameter(-1, 1,
|
||||
decimals=DECIMALS, default=-0.24, space='buy')
|
||||
buy_node_quantum_state_2 = DecimalParameter(
|
||||
-1, 1, decimals=DECIMALS, default=0.51, space='buy')
|
||||
buy_node_quantum_state_3 = DecimalParameter(-1, 1,
|
||||
decimals=DECIMALS, default=-0.27, space='buy')
|
||||
buy_node_quantum_state_4 = DecimalParameter(
|
||||
-1, 1, decimals=DECIMALS, default=0.35, space='buy')
|
||||
buy_node_quantum_state_5 = DecimalParameter(
|
||||
-1, 1, decimals=DECIMALS, default=0.99, space='buy')
|
||||
|
||||
if DUALFIT == False:
|
||||
sell_indicator_0 = CategoricalParameter(
|
||||
LearntKnowledges_with_timeperiod, default="BBANDS-2-6", space='sell')
|
||||
sell_indicator_1 = CategoricalParameter(
|
||||
LearntKnowledges_with_timeperiod, default="EMA-24", space='sell')
|
||||
sell_indicator_2 = CategoricalParameter(
|
||||
LearntKnowledges_with_timeperiod, default="BBANDS-2-12", space='sell')
|
||||
sell_indicator_3 = CategoricalParameter(
|
||||
LearntKnowledges_with_timeperiod, default="BBANDS-0-24", space='sell')
|
||||
sell_indicator_4 = CategoricalParameter(
|
||||
LearntKnowledges_with_timeperiod, default="MACD-1-12", space='sell')
|
||||
sell_indicator_5 = CategoricalParameter(
|
||||
LearntKnowledges_with_timeperiod, default="HT_PHASOR-1-12", space='sell')
|
||||
|
||||
sell_node_quantum_state_0 = DecimalParameter(-1, 1,
|
||||
decimals=DECIMALS, default=-0.15, space='sell')
|
||||
sell_node_quantum_state_1 = DecimalParameter(-1, 1,
|
||||
decimals=DECIMALS, default=-0.4, space='sell')
|
||||
sell_node_quantum_state_2 = DecimalParameter(-1, 1,
|
||||
decimals=DECIMALS, default=-0.56, space='sell')
|
||||
sell_node_quantum_state_3 = DecimalParameter(-1, 1,
|
||||
decimals=DECIMALS, default=-0.64, space='sell')
|
||||
sell_node_quantum_state_4 = DecimalParameter(-1, 1,
|
||||
decimals=DECIMALS, default=0.64, space='sell')
|
||||
sell_node_quantum_state_5 = DecimalParameter(-1, 1,
|
||||
decimals=DECIMALS, default=0.36, space='sell')
|
||||
|
||||
#########################################################
|
||||
|
||||
def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
|
||||
'''
|
||||
It's good to calculate all indicators in all time periods here and so optimize the strategy.
|
||||
But this strategy can take much time to generate anything that may not use in his optimization.
|
||||
I just calculate the specific indicators in specific time period inside buy and sell strategy populator methods if needed.
|
||||
Also, this method (populate_indicators) just calculates default value of hyperoptable params
|
||||
so using this method have not big benefits instade of calculating useable things inside buy and sell trand populators
|
||||
'''
|
||||
return dataframe
|
||||
|
||||
def populate_buy_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
|
||||
|
||||
# TODO: Its not dry code!
|
||||
|
||||
conditions = []
|
||||
RESULT = 0
|
||||
|
||||
IND = self.buy_indicator_0.value
|
||||
DFINP = dataframe[IND] = knowledge_calculator(dataframe, IND)
|
||||
QS = self.buy_node_quantum_state_0.value
|
||||
RESULT += DFINP*QS
|
||||
|
||||
IND = self.buy_indicator_1.value
|
||||
DFINP = dataframe[IND] = knowledge_calculator(dataframe, IND)
|
||||
QS = self.buy_node_quantum_state_1.value
|
||||
RESULT += DFINP*QS
|
||||
|
||||
IND = self.buy_indicator_2.value
|
||||
DFINP = dataframe[IND] = knowledge_calculator(dataframe, IND)
|
||||
QS = self.buy_node_quantum_state_2.value
|
||||
RESULT += DFINP*QS
|
||||
|
||||
IND = self.buy_indicator_3.value
|
||||
DFINP = dataframe[IND] = knowledge_calculator(dataframe, IND)
|
||||
QS = self.buy_node_quantum_state_3.value
|
||||
RESULT += DFINP*QS
|
||||
|
||||
IND = self.buy_indicator_4.value
|
||||
DFINP = dataframe[IND] = knowledge_calculator(dataframe, IND)
|
||||
QS = self.buy_node_quantum_state_4.value
|
||||
RESULT += DFINP*QS
|
||||
|
||||
IND = self.buy_indicator_5.value
|
||||
DFINP = dataframe[IND] = knowledge_calculator(dataframe, IND)
|
||||
QS = self.buy_node_quantum_state_5.value
|
||||
RESULT += DFINP*QS
|
||||
|
||||
RESULT = normalize(RESULT*dataframe['close'])
|
||||
# print(RESULT.head)
|
||||
|
||||
# 0.333 to 1 : buy
|
||||
conditions.append(RESULT > 0.333)
|
||||
|
||||
if conditions:
|
||||
dataframe.loc[
|
||||
reduce(lambda x, y: x & y, conditions),
|
||||
'buy'] = 1
|
||||
|
||||
return dataframe
|
||||
|
||||
def populate_sell_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
|
||||
|
||||
conditions = []
|
||||
|
||||
RESULT = 0
|
||||
if DUALFIT == True:
|
||||
IND = self.buy_indicator_0.value
|
||||
DFINP = dataframe[IND] = knowledge_calculator(dataframe, IND)
|
||||
QS = self.buy_node_quantum_state_0.value
|
||||
RESULT += DFINP*QS
|
||||
|
||||
IND = self.buy_indicator_1.value
|
||||
DFINP = dataframe[IND] = knowledge_calculator(dataframe, IND)
|
||||
QS = self.buy_node_quantum_state_1.value
|
||||
RESULT += DFINP*QS
|
||||
|
||||
IND = self.buy_indicator_2.value
|
||||
DFINP = dataframe[IND] = knowledge_calculator(dataframe, IND)
|
||||
QS = self.buy_node_quantum_state_2.value
|
||||
RESULT += DFINP*QS
|
||||
|
||||
IND = self.buy_indicator_3.value
|
||||
DFINP = dataframe[IND] = knowledge_calculator(dataframe, IND)
|
||||
QS = self.buy_node_quantum_state_3.value
|
||||
RESULT += DFINP*QS
|
||||
|
||||
IND = self.buy_indicator_4.value
|
||||
DFINP = dataframe[IND] = knowledge_calculator(dataframe, IND)
|
||||
QS = self.buy_node_quantum_state_4.value
|
||||
RESULT += DFINP*QS
|
||||
|
||||
IND = self.buy_indicator_5.value
|
||||
DFINP = dataframe[IND] = knowledge_calculator(dataframe, IND)
|
||||
QS = self.buy_node_quantum_state_5.value
|
||||
RESULT += DFINP*QS
|
||||
|
||||
else:
|
||||
IND = self.sell_indicator_0.value
|
||||
DFINP = dataframe[IND] = knowledge_calculator(dataframe, IND)
|
||||
QS = self.sell_node_quantum_state_0.value
|
||||
RESULT += DFINP*QS
|
||||
|
||||
IND = self.sell_indicator_1.value
|
||||
DFINP = dataframe[IND] = knowledge_calculator(dataframe, IND)
|
||||
QS = self.sell_node_quantum_state_1.value
|
||||
RESULT += DFINP*QS
|
||||
|
||||
IND = self.sell_indicator_2.value
|
||||
DFINP = dataframe[IND] = knowledge_calculator(dataframe, IND)
|
||||
QS = self.sell_node_quantum_state_2.value
|
||||
RESULT += DFINP*QS
|
||||
|
||||
IND = self.sell_indicator_3.value
|
||||
DFINP = dataframe[IND] = knowledge_calculator(dataframe, IND)
|
||||
QS = self.sell_node_quantum_state_3.value
|
||||
RESULT += DFINP*QS
|
||||
|
||||
IND = self.sell_indicator_4.value
|
||||
DFINP = dataframe[IND] = knowledge_calculator(dataframe, IND)
|
||||
QS = self.sell_node_quantum_state_4.value
|
||||
RESULT += DFINP*QS
|
||||
|
||||
IND = self.sell_indicator_5.value
|
||||
DFINP = dataframe[IND] = knowledge_calculator(dataframe, IND)
|
||||
QS = self.sell_node_quantum_state_5.value
|
||||
RESULT += DFINP*QS
|
||||
|
||||
RESULT = normalize(RESULT*dataframe['close'])
|
||||
# -1 to -0.333: sell
|
||||
conditions.append(RESULT < -0.333)
|
||||
|
||||
if conditions:
|
||||
dataframe.loc[
|
||||
reduce(lambda x, y: x & y, conditions),
|
||||
'sell']=1
|
||||
|
||||
return dataframe
|
||||
@@ -15,23 +15,38 @@ import freqtrade.vendor.qtpylib.indicators as qtpylib
|
||||
|
||||
|
||||
class mabStra(IStrategy):
|
||||
# #################### RESULTS PASTE PLACE ####################
|
||||
# ROI table:
|
||||
minimal_roi = {
|
||||
"0": 0.598,
|
||||
"644": 0.166,
|
||||
"3269": 0.115,
|
||||
"7289": 0
|
||||
}
|
||||
|
||||
# Stoploss:
|
||||
stoploss = -0.128
|
||||
# Buy hypers
|
||||
timeframe = '4h'
|
||||
|
||||
# #################### END OF RESULT PLACE ####################
|
||||
|
||||
# buy params
|
||||
buy_mojo_ma_timeframe = IntParameter(2, 100, default=7, space='buy')
|
||||
buy_fast_ma_timeframe = IntParameter(2, 100, default=14, space='buy')
|
||||
buy_slow_ma_timeframe = IntParameter(2, 100, default=28, space='buy')
|
||||
buy_div_max = DecimalParameter(0, 2, decimals=4, default=2.25446, space='buy')
|
||||
buy_div_min = DecimalParameter(0, 2, decimals=4, default=0.29497, space='buy')
|
||||
buy_div_max = DecimalParameter(
|
||||
0, 2, decimals=4, default=2.25446, space='buy')
|
||||
buy_div_min = DecimalParameter(
|
||||
0, 2, decimals=4, default=0.29497, space='buy')
|
||||
# sell params
|
||||
sell_mojo_ma_timeframe = IntParameter(2, 100, default=7, space='sell')
|
||||
sell_fast_ma_timeframe = IntParameter(2, 100, default=14, space='sell')
|
||||
sell_slow_ma_timeframe = IntParameter(2, 100, default=28, space='sell')
|
||||
sell_div_max = DecimalParameter(0, 2, decimals=4, default=1.54593, space='sell')
|
||||
sell_div_min = DecimalParameter(0, 2, decimals=4, default=2.81436, space='sell')
|
||||
|
||||
stoploss = -0.1
|
||||
|
||||
# Optimal timeframe use it in your config
|
||||
timeframe = '4h'
|
||||
sell_div_max = DecimalParameter(
|
||||
0, 2, decimals=4, default=1.54593, space='sell')
|
||||
sell_div_min = DecimalParameter(
|
||||
0, 2, decimals=4, default=2.81436, space='sell')
|
||||
|
||||
def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
|
||||
# SMA - ex Moving Average
|
||||
|
||||
@@ -64,7 +64,12 @@ class wtc(IStrategy):
|
||||
"sell_min0": 0.0628,
|
||||
"sell_min1": 0.4461,
|
||||
}
|
||||
|
||||
minimal_roi = {
|
||||
"0": 0.30873,
|
||||
"569": 0.16689,
|
||||
"3211": 0.06473,
|
||||
"7617": 0
|
||||
}
|
||||
stoploss = -0.128
|
||||
############################## END SETTINGS ##############################
|
||||
timeframe = '30m'
|
||||
|
||||
Reference in New Issue
Block a user