Timeframe
1d
Direction
Long Only
Stoploss
-33.5%
Trailing Stop
Yes
ROI
0m: 10000.0%
Interface Version
3
Startup Candles
N/A
Indicators
5
import numpy as np # noqa
import pandas as pd # noqa
from pandas import DataFrame # noqa
from datetime import datetime # noqa
from typing import Optional, Union # noqa
from freqtrade.strategy import (BooleanParameter, CategoricalParameter, DecimalParameter,
IStrategy, IntParameter)
# --------------------------------
# Add your lib to import here
import talib.abstract as ta
import pandas_ta as pta
import freqtrade.vendor.qtpylib.indicators as qtpylib
from functools import reduce
class MACDSMA200hyperopt2(IStrategy):
# Strategy interface version - allow new iterations of the strategy interface.
# Check the documentation or the Sample strategy to get the latest version.
INTERFACE_VERSION = 3
# Optimal timeframe for the strategy.
timeframe = '1d'
# Can this strategy go short?
can_short: bool = True
# Minimal ROI designed for the strategy.
# This attribute will be overridden if the config file contains "minimal_roi".
minimal_roi = {
"0": 100
}
# Optimal stoploss designed for the strategy.
# This attribute will be overridden if the config file contains "stoploss".
stoploss = -0.335
# Trailing stoploss
trailing_stop = True
trailing_only_offset_is_reached = True
trailing_stop_positive = 0.01
trailing_stop_positive_offset = 0.04 # Disabled / not configured
# Run "populate_indicators()" only for new candle.
process_only_new_candles = True
# These values can be overridden in the config.
use_exit_signal = True
exit_profit_only = False
ignore_roi_if_entry_signal = False
# Number of candles the strategy requires before producing valid signals
startup_candle_count: int = 30
# Strategy parameters
buy_ema_short = IntParameter(7, 17, default=17)
buy_ema_long = IntParameter(20, 35, default=27)
sell_ema_short = IntParameter(7, 17, default=16)
sell_ema_long = IntParameter(20, 35, default=27)
# Optional order type mapping.
order_types = {
'entry': 'limit',
'exit': 'limit',
'stoploss': 'market',
'stoploss_on_exchange': False
}
# Optional order time in force.
order_time_in_force = {
'entry': 'GTC',
'exit': 'GTC'
}
@property
def plot_config(self):
return {
# Main plot indicators (Moving averages, ...)
'main_plot': {
'tema': {},
'sar': {'color': 'white'},
},
'subplots': {
# Subplots - each dict defines one additional plot
"MACD": {
'macd': {'color': 'blue'},
'macdsignal': {'color': 'orange'},
},
}
}
def informative_pairs(self):
return []
def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
for val in self.buy_ema_short.range:
dataframe[f'ema_short_{val}'] = ta.EMA(dataframe, timeperiod=val)
# Calculate all ema_long values
for val in self.buy_ema_long.range:
dataframe[f'ema_long_{val}'] = ta.EMA(dataframe, timeperiod=val)
for val in self.sell_ema_short.range:
dataframe[f'ema_short_{val}'] = ta.EMA(dataframe, timeperiod=val)
# Calculate all ema_long values
for val in self.sell_ema_long.range:
dataframe[f'ema_long_{val}'] = ta.EMA(dataframe, timeperiod=val)
# MACD
macd = ta.MACD(dataframe)
dataframe['macd'] = macd['macd']
dataframe['macdsignal'] = macd['macdsignal']
dataframe['macdhist'] = macd['macdhist']
# # EMA - Exponential Moving Average
# dataframe['ema3'] = ta.EMA(dataframe, timeperiod=3)
# dataframe['ema5'] = ta.EMA(dataframe, timeperiod=5)
# dataframe['ema12'] = ta.EMA(dataframe, timeperiod=12)
# dataframe['ema26'] = ta.EMA(dataframe, timeperiod=26)
# dataframe['ema50'] = ta.EMA(dataframe, timeperiod=50)
# dataframe['ema100'] = ta.EMA(dataframe, timeperiod=100)
# # SMA - Simple Moving Average
# dataframe['sma3'] = ta.SMA(dataframe, timeperiod=3)
# dataframe['sma5'] = ta.SMA(dataframe, timeperiod=5)
# dataframe['sma10'] = ta.SMA(dataframe, timeperiod=10)
# dataframe['sma21'] = ta.SMA(dataframe, timeperiod=21)
# dataframe['sma50'] = ta.SMA(dataframe, timeperiod=50)
dataframe['sma200'] = ta.SMA(dataframe, timeperiod=200)
return dataframe
def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
conditions = []
conditions.append(dataframe[f'ema_short_{self.buy_ema_short.value}'] > dataframe[f'ema_long_{self.buy_ema_long.value}'])
conditions.append(dataframe['macdhist'] > 0)
conditions.append(dataframe['macd'] > 0)
conditions.append(dataframe['macdsignal'] > 0)
conditions.append(dataframe['close'] > dataframe['sma200'])
conditions.append(dataframe['volume'] > 0)
if conditions:
dataframe.loc[
reduce(lambda x, y: x & y, conditions),
'enter_long'] = 1
'''
dataframe.loc[
(
(dataframe['macdhist'] > 0) &
(dataframe['macd'] > 0) &
(dataframe['macdsignal'] > 0) &
(dataframe['ema12'] > dataframe['ema26']) &
(dataframe['close'] > dataframe['sma200']) &
(dataframe['volume'] > 0)
),
'enter_long'] = 1
# Uncomment to use shorts (Only used in futures/margin mode. Check the documentation for more info)
'''
conditions = []
conditions.append(dataframe[f'ema_short_{self.buy_ema_short.value}'] < dataframe[f'ema_long_{self.buy_ema_long.value}'])
conditions.append(dataframe['macdhist'] < 0)
conditions.append(dataframe['macd'] < 0)
conditions.append(dataframe['macdsignal'] < 0)
conditions.append(dataframe['close'] < dataframe['sma200'])
conditions.append(dataframe['volume'] > 0)
if conditions:
dataframe.loc[
reduce(lambda x, y: x & y, conditions),
'enter_short'] = 1
'''
dataframe.loc[
(
(dataframe['macdhist'] < 0) &
(dataframe['macd'] < 0) &
(dataframe['macdsignal'] < 0) &
(dataframe['ema12'] < dataframe['ema26']) &
(dataframe['close'] < dataframe['sma200']) &
(dataframe['volume'] > 0)
),
'enter_short'] = 1
'''
return dataframe
def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
conditions = []
conditions.append(dataframe['macd'] < 0)
conditions.append(qtpylib.crossed_below(dataframe[f'ema_short_{self.sell_ema_short.value}'], dataframe[f'ema_long_{self.sell_ema_long.value}']))
conditions.append(dataframe['volume'] > 0)
if conditions:
dataframe.loc[
reduce(lambda x, y: x & y, conditions),
'exit_long'] = 1
'''
dataframe.loc[
(
(dataframe['macd'] < 0) &
(qtpylib.crossed_below(dataframe['ema12'], dataframe['ema26'])) &
(dataframe['volume'] > 0)
),
'exit_long'] = 1
'''
# Uncomment to use shorts (Only used in futures/margin mode. Check the documentation for more info)
conditions = []
conditions.append(dataframe['macd'] > 0)
conditions.append(qtpylib.crossed_above(dataframe[f'ema_short_{self.sell_ema_short.value}'], dataframe[f'ema_long_{self.sell_ema_long.value}']))
conditions.append(dataframe['volume'] > 0)
if conditions:
dataframe.loc[
reduce(lambda x, y: x & y, conditions),
'exit_short'] = 1
'''
dataframe.loc[
(
(dataframe['macd'] > 0) &
(qtpylib.crossed_above(dataframe['ema12'], dataframe['ema26'])) &
(dataframe['volume'] > 0)
),
'exit_short'] = 1
'''
return dataframe
# HYPEROPT 2
# Best result:
# 544/1000: 700 trades. 630/0/70 Wins/Draws/Losses. Avg profit 1.72%. Median profit 2.96%. Total profit 32285.70929172 USDT ( 645.71%). Avg duration 3 days, 14:12:00 min.
# Objective: -2.00641
# # Buy hyperspace params:
# buy_params = {
# "buy_ema_long": 27,
# "buy_ema_short": 17,
# }
# # Sell hyperspace params:
# sell_params = {
# "sell_ema_long": 27,
# "sell_ema_short": 16,
# }
# # ROI table: # value loaded from strategy
# minimal_roi = {
# "0": 100
# }
# # Stoploss:
# stoploss = -0.335
# # Trailing stop:
# trailing_stop = True
# trailing_stop_positive = 0.01
# trailing_stop_positive_offset = 0.04
# trailing_only_offset_is_reached = True
# bot morš ugasn po prvem končanem bull runnu bo bitcoin halvingu. Ker je biu a big drop po bull runnu so najbol volatile coini vsi tejakl 33% hit in si zgubu 7k profitou.
# bejsikli polic se morš pazt
# READY ZA DRY RUN
# Dry run bug
# https://github.com/freqtrade/freqtrade/issues/614
# freqtrade trade --config MACDSMA200hyperopt2.json --strategy MACDSMA200hyperopt2