Timeframe
1d
Direction
Long Only
Stoploss
-31.4%
Trailing Stop
No
ROI
0m: 64.2%, 8834m: 37.0%, 25392m: 11.8%, 55146m: 0.0%
Interface Version
N/A
Startup Candles
N/A
Indicators
3
freqtrade/freqtrade-strategies
Sample strategy implementing Informative Pairs - compares stake_currency with USDT. Not performing very well - but should serve as an example how to use a referential pair against USDT. author@: xmatthias github@: https://github.com/freqtrade/freqtrade-strategies
freqtrade/freqtrade-strategies
Strategy 003 author@: Gerald Lonlas github@: https://github.com/freqtrade/freqtrade-strategies
freqtrade/freqtrade-strategies
# Ichess Strategy ichimoku_score
# Associate various ichimoku signals with a score.
# For example, bullish signal => positive score,
# and bearish signal => negative score. If the total score is above 0, it may indicate a bullish trend .
# Otherwise, if it is below 0, it may indicate a bearish trend .
# We used two smoothed moving averages to find the trend.
# More info:
# https://github.com/freqtrade/freqtrade-strategies/issues/97
# https://www.tradingview.com/script/P1bybHZA-Ichimoku-Cloud-Signal-Score-v2-0-0/
# Author: @Mablue (Masoud Azizi)
# github: https://github.com/mablue/
# --- Do not remove these libs ---
from freqtrade.strategy import IntParameter
from freqtrade.strategy.interface import IStrategy
from pandas import DataFrame
import numpy as np
# --------------------------------
# Add your lib to import here
# import talib.abstract as ta
import talib as ta
import freqtrade.vendor.qtpylib.indicators as qtpylib
from functools import reduce
class Ichess(IStrategy):
# ROI table:
minimal_roi = {
"0": 0.642,
"8834": 0.37,
"25392": 0.118,
"55146": 0
}
# Stoploss:
stoploss = -0.314
# Opt Timeframe
timeframe = '1d'
buy_fast_timeperiod = IntParameter(2, 50, default=9, space="buy")
buy_slow_timeperiod = IntParameter(2, 50, default=10, space="buy")
sell_fast_timeperiod = IntParameter(2, 50, default=15, space="sell")
sell_slow_timeperiod = IntParameter(2, 50, default=16, space="sell")
def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
conversion_line_period = 9
base_line_periods = 26
laggin_span = 52
displacement = 26
df = dataframe.copy()
# Heikin Ashi Strategy
heikinashi = qtpylib.heikinashi(df)
df['ha_open'] = heikinashi['open']
df['ha_close'] = heikinashi['close']
df['ha_high'] = heikinashi['high']
df['ha_low'] = heikinashi['low']
df['tenkan'] = (df['ha_high'].rolling(window=conversion_line_period).max() +
df['ha_low'].rolling(window=conversion_line_period).min()) / 2
df['kijun'] = (df['ha_high'].rolling(window=base_line_periods).max() +
df['ha_low'].rolling(window=base_line_periods).min()) / 2
df['senkou_leading_a'] = (df['tenkan'] + df['kijun']) / 2
df['senkou_leading_b'] = (df['ha_high'].rolling(
window=laggin_span).max() + df['ha_low'].rolling(window=laggin_span).min()) / 2
df['senkou_span_a'] = df['senkou_leading_a'].shift(displacement)
df['senkou_span_b'] = df['senkou_leading_b'].shift(displacement)
df['chikou_span'] = df['ha_close'].shift(displacement)
df['tenkan1'] = df['tenkan'].shift(+1)
df['kijun1'] = df['kijun'].shift(+1)
df['senkou_leading_a1'] = df['senkou_leading_a'].shift(+1)
df['senkou_leading_b1'] = df['senkou_leading_b'].shift(+1)
df['senkou_span_a1'] = df['senkou_span_a'].shift(+1)
df['senkou_span_b1'] = df['senkou_span_b'].shift(+1)
df['chikou_span1'] = df['chikou_span'].shift(+1)
df['ha_close1'] = df['ha_close'].shift(+1)
# // == Price and Kijun Sen (standard line) Cross ==
def calcTkCross(
tenkan,
kijun,
tenkan1,
kijun1,
senkou_span_a,
senkou_span_b,
):
if (tenkan > kijun) and (tenkan1 <= kijun1):
intersect = (tenkan1 * (kijun - kijun1) - kijun1 * (tenkan -
tenkan1)) / ((kijun - kijun1) - (tenkan - tenkan1))
if (intersect > senkou_span_a) and (intersect > senkou_span_b):
return 2
elif(intersect < senkou_span_a) and (intersect < senkou_span_b):
return 0.5
else:
return 1
elif (tenkan < kijun) and (tenkan1 >= kijun1):
intersect = (tenkan1 * (kijun - kijun1) - kijun1 * (tenkan -
tenkan1)) / ((kijun - kijun1) - (tenkan - tenkan1))
if (intersect > senkou_span_a) and (intersect > senkou_span_b):
return -0.5
elif(intersect < senkou_span_a) and (intersect < senkou_span_b):
return -2
else:
return -1
else:
return 0
# df['tkCrossScore'] = np.vectorize(calcTkCross)()
df['tkCrossScore'] = np.vectorize(calcTkCross)(
df['tenkan'],
df['kijun'],
df['tenkan1'],
df['kijun1'],
df['senkou_span_a'],
df['senkou_span_b'],
)
# // == Price and Kijun Sen (standard line) Cross ==
def calcPkCross(
ha_close,
kijun,
ha_close1,
kijun1,
senkou_span_a,
senkou_span_b,
):
if (ha_close > kijun) and (ha_close1 <= kijun1):
intersect = (ha_close1 * (kijun - kijun1) - kijun1 * (ha_close -
ha_close1)) / ((kijun - kijun1) - (ha_close - ha_close1))
if (intersect > senkou_span_a) and (intersect > senkou_span_b):
return 2
elif(intersect < senkou_span_a) and (intersect < senkou_span_b):
return 0.5
else:
return 1
elif (ha_close < kijun) and (ha_close1 >= kijun1):
intersect = (ha_close1 * (kijun - kijun1) - kijun1 * (ha_close -
ha_close1)) / ((kijun - kijun1) - (ha_close - ha_close1))
if (intersect > senkou_span_a) and (intersect > senkou_span_b):
return -0.5
elif(intersect < senkou_span_a) and (intersect < senkou_span_b):
return -2
else:
return -1
else:
return 0
df['pkCrossScore'] = np.vectorize(calcPkCross)(
df['ha_close'],
df['kijun'],
df['ha_close1'],
df['kijun1'],
df['senkou_span_a'],
df['senkou_span_b'],
)
# // == Kumo Breakouts ==
def calcKumoBreakout(
ha_close,
senkou_span_a,
ha_close1,
senkou_span_a1,
senkou_span_b,
senkou_span_b1,
):
if (((ha_close > senkou_span_a) and (ha_close1 <= senkou_span_a1) and (senkou_span_a > senkou_span_b)) or ((ha_close > senkou_span_b) and (ha_close1 <= senkou_span_b1) and (senkou_span_a < senkou_span_b))):
return 2
elif(((ha_close < senkou_span_a) and (ha_close1 >= senkou_span_a1) and (senkou_span_a < senkou_span_b)) or ((ha_close < senkou_span_b) and (ha_close1 >= senkou_span_b1) and (senkou_span_a > senkou_span_b))):
return -2
else:
return 0
df['kumoBreakoutScore'] = np.vectorize(calcKumoBreakout)(
df['ha_close'],
df['senkou_span_a'],
df['ha_close1'],
df['senkou_span_a1'],
df['senkou_span_b'],
df['senkou_span_b1'],
)
# // == Senkou Span Cross ==
def calcSenkouCross(
senkou_leading_a,
senkou_leading_b,
senkou_leading_a1,
senkou_leading_b1,
ha_close,
senkou_span_a,
senkou_span_b,
):
if (senkou_leading_a > senkou_leading_b) and (senkou_leading_a1 <= senkou_leading_b1):
if (ha_close > senkou_span_a) and (ha_close > senkou_span_b):
return 2
elif(ha_close < senkou_span_a) and (ha_close < senkou_span_b):
return 0.5
else:
return 1
elif (senkou_leading_a < senkou_leading_b) and (senkou_leading_a1 >= senkou_leading_b1):
if (ha_close > senkou_span_a) and (ha_close > senkou_span_b):
return -0.5
elif(ha_close < senkou_span_a) and (ha_close < senkou_span_b):
return -2
else:
return -1
else:
return 0
df['senkouCrossScore'] = np.vectorize(calcSenkouCross)(
df['senkou_leading_a'],
df['senkou_leading_b'],
df['senkou_leading_a1'],
df['senkou_leading_b1'],
df['ha_close'],
df['senkou_span_a'],
df['senkou_span_b'],
)
# // == Chikou Span Cross ==
def calcChikouCross(
ha_close,
chikou_span,
ha_close1,
chikou_span1,
senkou_span_a,
senkou_span_b,
):
if (ha_close > chikou_span) and (ha_close1 <= chikou_span1):
intersect = (ha_close1 * (chikou_span - chikou_span1) - chikou_span1 * (
ha_close - ha_close1)) / ((chikou_span - chikou_span1) - (ha_close - ha_close1))
if (intersect > senkou_span_a) and (intersect > senkou_span_b):
return 2
elif(intersect < senkou_span_a) and (intersect < senkou_span_b):
return 0.5
else:
return 1
elif (ha_close < chikou_span) and (ha_close1 >= chikou_span1):
intersect = (ha_close1 * (chikou_span - chikou_span1) - chikou_span1 * (
ha_close - ha_close1)) / ((chikou_span - chikou_span1) - (ha_close - ha_close1))
if (intersect > senkou_span_a) and (intersect > senkou_span_b):
return -0.5
elif(intersect < senkou_span_a) and (intersect < senkou_span_b):
return -2
else:
return -1
else:
return 0
df['chikouCrossScore'] = np.vectorize(calcChikouCross)(
df['ha_close'],
df['chikou_span'],
df['ha_close1'],
df['chikou_span1'],
df['senkou_span_a'],
df['senkou_span_b'],
)
# // == price relative to cloud ==
def calcPricePlacement(
ha_close,
senkou_span_a,
senkou_span_b,
):
if (ha_close > senkou_span_a) and (ha_close > senkou_span_b):
return 2
elif(ha_close < senkou_span_a) and (ha_close < senkou_span_b):
return -2
else:
return 0
df['pricePlacementScore'] = np.vectorize(calcPricePlacement)(
df['ha_close'],
df['senkou_span_a'],
df['senkou_span_b'],
)
# // == lag line releative to cloud ==
def calcChikouPlacement(
ha_close,
senkou_leading_a,
senkou_leading_b,
):
if (ha_close > senkou_leading_a) and (ha_close > senkou_leading_b):
return 2
elif(ha_close < senkou_leading_a) and (ha_close < senkou_leading_b):
return -2
else:
return 0
df['chikouPlacementScore'] = np.vectorize(calcChikouPlacement)(
df['ha_close'],
df['senkou_leading_a'],
df['senkou_leading_b'],
)
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # //
dataframe['Ichimoku_Score'] = (
df['tkCrossScore'] +
df['pkCrossScore'] +
df['kumoBreakoutScore'] +
df['senkouCrossScore'] +
df['chikouCrossScore']
).rolling(1).sum().cumsum()
print(metadata['pair'],dataframe['Ichimoku_Score'].median())
return dataframe
def populate_buy_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
# exit()
dataframe.loc[
# (dataframe['Ichimoku_Score']>0)&
qtpylib.crossed_above(
ta.SMA(dataframe['Ichimoku_Score'], self.buy_fast_timeperiod.value),
ta.SMA(dataframe['Ichimoku_Score'], self.buy_slow_timeperiod.value)
), 'buy'] = 1
return dataframe
def populate_sell_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
dataframe.loc[
# (dataframe['Ichimoku_Score']<0)|
(
qtpylib.crossed_below(
ta.SMA(dataframe['Ichimoku_Score'], self.sell_fast_timeperiod.value),
ta.SMA(dataframe['Ichimoku_Score'], self.sell_slow_timeperiod.value)
)
), 'sell'] = 1
return dataframe