Timeframe
1h
Direction
Long Only
Stoploss
-10.0%
Trailing Stop
No
ROI
N/A
Interface Version
N/A
Startup Candles
N/A
Indicators
0
freqtrade/freqtrade-strategies
freqtrade/freqtrade-strategies
freqtrade/freqtrade-strategies
this is an example class, implementing a PSAR based trailing stop loss you are supposed to take the `custom_stoploss()` and `populate_indicators()` parts and adapt it to your own strategy
freqtrade/freqtrade-strategies
# populate_buy_trend, 横盘策略
# 时间周期1h
# 横盘超过12小时,
# 横盘振幅不超过8%
# 横盘的第一根k线跟横盘的最后一根k线的振幅不能超过8%
# 假设现在已经有横盘30根k线,第1根根第30跟的振幅不超过8%。而你的策略只计算了连续的12根k线,
import talib.abstract as ta
import pandas as pd
import numpy as np
from freqtrade.strategy.interface import IStrategy
class CustomStrategy2(IStrategy):
timeframe = '1h'
stoploss = -0.10
roi = {
"0": 0.1,
}
trailing_stop = False
def populate_indicators(self, dataframe: pd.DataFrame, metadata: dict) -> pd.DataFrame:
# Define the criteria for a sideways market (e.g., a price range within a certain percentage)
sideways_market_pct = 0.08
dataframe['sideways_market'] = False
dataframe['sideways_low'] = np.nan
# Find the sideways market that lasts for at least 12 hours
for i in range(len(dataframe) - 12):
sideways_start = i
sideways_end = i + 11
max_price = dataframe['high'][sideways_start:sideways_end + 1].max()
min_price = dataframe['low'][sideways_start:sideways_end + 1].min()
first_candle_range = (dataframe.at[sideways_start, 'high'] - dataframe.at[sideways_start, 'low']) / dataframe.at[sideways_start, 'low']
last_candle_range = (dataframe.at[sideways_end, 'high'] - dataframe.at[sideways_end, 'low']) / dataframe.at[sideways_end, 'low']
if (max_price - min_price) / min_price <= sideways_market_pct and first_candle_range <= sideways_market_pct and last_candle_range <= sideways_market_pct:
dataframe.at[sideways_end, 'sideways_market'] = True
dataframe.at[sideways_end, 'sideways_low'] = min_price
return dataframe
def populate_buy_trend(self, dataframe: pd.DataFrame, metadata: dict) -> pd.DataFrame:
# Define the buy signal conditions
dataframe.loc[
(
(dataframe['sideways_market'] == True) &
(dataframe['close'] <= dataframe['sideways_low'])
),
'buy'] = 1
return dataframe
def populate_sell_trend(self, dataframe: pd.DataFrame, metadata: dict) -> pd.DataFrame:
# Initialize the sell signal column
dataframe['sell'] = 0
# Loop through the rows and set the sell signal if the price goes below the previous sideways low
for i in range(len(dataframe) - 1):
if dataframe.at[i, 'sideways_market']:
if dataframe.at[i+1, 'close'] < dataframe.at[i, 'sideways_low']:
dataframe.at[i+1, 'sell'] = 1
return dataframe