SMA Crossover Strategy
Timeframe
1h
Direction
Long Only
Stoploss
-5.0%
Trailing Stop
Yes
ROI
0m: 10.0%, 30m: 5.0%, 60m: 2.5%, 120m: 1.0%
Interface Version
3
Startup Candles
N/A
Indicators
2
freqtrade/freqtrade-strategies
Strategy 003 author@: Gerald Lonlas github@: https://github.com/freqtrade/freqtrade-strategies
"""
SMA Crossover Strategy
Generated by TradingView Strategy Research Lab
Date: 2026-01-13
Simple Moving Average Crossover Strategy
- Fast SMA: 20
- Slow SMA: 50
- Entry: Fast SMA crosses above Slow SMA
- Exit: Fast SMA crosses below Slow SMA
"""
from freqtrade.strategy import IStrategy, IntParameter
from pandas import DataFrame
import talib.abstract as ta
class SampleStrategy(IStrategy):
"""
SMA Crossover Strategy
검증된 기본 전략 - 드라이런 테스트용
"""
# 전략 설정
INTERFACE_VERSION = 3
# 타임프레임
timeframe = '1h'
# 리스크 관리
stoploss = -0.05 # -5%
trailing_stop = True
trailing_stop_positive = 0.01 # +1%에서 트레일링 시작
trailing_stop_positive_offset = 0.02 # +2% 오프셋
trailing_only_offset_is_reached = True
# ROI 테이블
minimal_roi = {
"0": 0.10, # 즉시 10% 수익 시 청산
"30": 0.05, # 30분 후 5% 수익 시 청산
"60": 0.025, # 1시간 후 2.5% 수익 시 청산
"120": 0.01, # 2시간 후 1% 수익 시 청산
}
# 주문 설정
order_types = {
'entry': 'limit',
'exit': 'limit',
'stoploss': 'market',
'stoploss_on_exchange': True
}
# 최적화 가능한 파라미터
fast_period = IntParameter(10, 30, default=20, space='buy')
slow_period = IntParameter(30, 100, default=50, space='buy')
def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
"""
지표 계산
"""
# SMA
dataframe['sma_fast'] = ta.SMA(dataframe['close'], timeperiod=self.fast_period.value)
dataframe['sma_slow'] = ta.SMA(dataframe['close'], timeperiod=self.slow_period.value)
# RSI (필터용)
dataframe['rsi'] = ta.RSI(dataframe['close'], timeperiod=14)
# Volume
dataframe['volume_mean'] = dataframe['volume'].rolling(20).mean()
return dataframe
def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
"""
진입 조건
"""
dataframe.loc[
(
# SMA 골든 크로스
(dataframe['sma_fast'] > dataframe['sma_slow']) &
(dataframe['sma_fast'].shift(1) <= dataframe['sma_slow'].shift(1)) &
# RSI 필터 (과매수 아닐 때)
(dataframe['rsi'] < 70) &
# 거래량 필터
(dataframe['volume'] > dataframe['volume_mean'])
),
'enter_long'] = 1
return dataframe
def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
"""
청산 조건
"""
dataframe.loc[
(
# SMA 데드 크로스
(dataframe['sma_fast'] < dataframe['sma_slow']) &
(dataframe['sma_fast'].shift(1) >= dataframe['sma_slow'].shift(1))
),
'exit_long'] = 1
return dataframe