9秒狙击手策略 V3 - 保守稳定版
Timeframe
1m
Direction
Long Only
Stoploss
-0.6%
Trailing Stop
Yes
ROI
0m: 0.8%, 30m: 0.6%, 60m: 0.4%
Interface Version
N/A
Startup Candles
100
Indicators
5
freqtrade/freqtrade-strategies
Strategy 003 author@: Gerald Lonlas github@: https://github.com/freqtrade/freqtrade-strategies
from freqtrade.strategy import IStrategy
from pandas import DataFrame
import pandas as pd
import talib.abstract as ta
from datetime import datetime
import numpy as np
class NineSecondSniperV3(IStrategy):
"""
9秒狙击手策略 V3 - 保守稳定版
核心理念:
- 捕捉9秒级别的价格变化
- SAR 指标识别趋势反转
- 狙击式入场后快速止盈止损
- 严格风控,避免赌博式交易
"""
timeframe = '1m'
max_open_trades = 2
stake_amount = 100
startup_candle_count = 100
# 止盈配置 - 快速止盈
minimal_roi = {
"0": 0.008, # 0.8% 快速止盈
"30": 0.006, # 30分钟降到0.6%
"60": 0.004, # 60分钟降到0.4%
}
# 紧凑止损
stoploss = -0.006 # 0.6% 止损
trailing_stop = True # 启用追踪止损
trailing_stop_positive = 0.004 # 0.4% 盈利后启动
trailing_stop_positive_offset = 0.006 # 0.6% 偏离
order_types = {
'entry': 'market',
'exit': 'market',
'stoploss': 'market',
'stoploss_on_exchange': False,
'entry_pricing': 'same',
'exit_pricing': 'same'
}
unfilledtimeout = {
'entry': 10,
'exit': 10,
'unit': 'seconds'
}
# 保守杠杆配置
base_leverage_config = {
'BTC/USDT:USDT': 2.0,
'ETH/USDT:USDT': 1.5,
'SOL/USDT:USDT': 1.5,
'XRP/USDT:USDT': 1.0,
'DOGE/USDT:USDT': 1.0
}
# 价格缓冲区
price_buffer_size = 9
price_buffers = {}
# 冷却计时器
last_entry_time = {}
cooldown_minutes = 15 # 两次入场间隔15分钟
def informative_pairs(self) -> list:
return []
def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
df = dataframe.copy()
pair = metadata['pair']
# ========== 核心指标 ==========
# SAR 指标 - 抛物线,找趋势反转
df['sar'] = ta.SAR(df['high'].values, df['low'].values,
acceleration=0.02, maximum=0.2)
# EMA 趋势线
df['ema_5'] = ta.EMA(df['close'].values, timeperiod=5)
df['ema_13'] = ta.EMA(df['close'].values, timeperiod=13)
# RSI - 避免超买超卖
df['rsi'] = ta.RSI(df['close'].values, timeperiod=14)
# MACD - 动能指标
macd, macdsignal, macdhist = ta.MACD(df['close'].values)
df['macd'] = macd
df['macd_signal'] = macdsignal
df['macd_hist'] = macdhist
# 成交量
df['volume_sma'] = ta.SMA(df['volume'].values, timeperiod=20)
df['volume_ratio'] = df['volume'] / df['volume_sma']
# ========== 9秒动能 ==========
# 9根K线价格对比
df['price_9sec_ago'] = df['close'].shift(9)
df['price_change_9sec'] = (df['close'] - df['price_9sec_ago']) / df['price_9sec_ago']
df['volatility_9sec'] = abs(df['price_change_9sec'])
# 价格缓冲区维护
if pair not in self.price_buffers:
self.price_buffers[pair] = np.zeros(self.price_buffer_size)
buffer = self.price_buffers[pair]
for i in range(len(df)):
if i >= self.price_buffer_size:
buffer[:-1] = buffer[1:]
buffer[-1] = df['close'].iloc[i]
df['buffer_momentum'] = 0.0
if len(buffer) >= self.price_buffer_size:
df['buffer_momentum'] = (buffer[-1] - buffer[0]) / buffer[0]
return df
def leverage(self, pair: str, current_time: datetime, current_rate: float,
current_profit: float = 0.0, min_stops: float = 0.0,
max_stops: float = 0.0, current_time_rows: DataFrame = None,
**kwargs) -> float:
base_leverage = self.base_leverage_config.get(pair, 1.0)
# 保守策略:盈利时降低杠杆
if current_profit > 0.003: # 盈利 > 0.3%
base_leverage *= 0.5 # 减半杠杆保护利润
elif current_profit < -0.003: # 亏损 > 0.3%
base_leverage *= 0.7 # 降低杠杆控制风险
return min(base_leverage, 3.0) # 最大杠杆限制
def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
df = dataframe.copy()
df['enter_long'] = 0
if len(df) < self.startup_candle_count:
return df
# ========== 狙击手入场条件 ==========
# 核心逻辑:SAR 支撑 + 多重确认 + 向上动
entry_conditions = (
# 1. SAR 支撑确认(价格在 SAR 上方,可能是向上突破)
(df['close'] > df['sar']) &
# 2. EMA 金叉确认(短期均线上穿长期)
(df['ema_5'] > df['ema_13']) &
# 3. RSI 区间确认(不超买,有上涨空间)
(df['rsi'] > 40) & (df['rsi'] < 65) &
# 4. MACD 金叉确认(动能向上)
(df['macd'] > df['macd_signal']) &
# 5. 成交量确认(量能放大)
(df['volume_ratio'] > 1.3) &
# 6. 9秒动向上确认(短期向上动)
(df['price_change_9sec'] > 0.001) &
# 7. 缓冲区动确认
(df['buffer_momentum'] > 0.0005)
)
df.loc[entry_conditions, 'enter_long'] = 1
return df
def populate_exit_trend(self, (dataframe: DataFrame, metadata: dict) -> DataFrame:
df = dataframe.copy()
df['exit'] = 0
# ========== 快速出场条件 ==========
exit_conditions = (
# 1. EMA 死叉(趋势反转)
(df['ema_5'] < df['ema_13']) |
# 2. MACD 死叉
(df['macd'] < df['macd_signal']) |
# 3. RSI 超买
(df['rsi'] > 70) |
# 4. 9秒动向下
(df['price_change_9sec'] < -0.001)
)
df.loc[exit_conditions, 'exit'] = 1
return df
def custom_exit(self, pair: str, current_time: datetime, current_rate: float,
current_profit: float, **kwargs) -> bool:
# 追踪止损主要处理,这里作为额外保险
# 紧凑止损保险
if current_profit < -0.01: # -1% 保险止损
return True
# 快速止盈保险
if current_profit > 0.015: # 1.5% 保险止盈
return True
return False