StrategyGeneratorLatest / bt_strategy.py
JuanFuriaz's picture
Upload folder using huggingface_hub
63bad2b verified
Raw
History Blame Contribute Delete
2.02 kB
# Model deepseek-reasoner
import backtrader as bt
class TripleMACross(bt.Strategy):
"""
Triple moving average crossover strategy with 10% position sizing.
- Entry: Fast SMA (5) crosses above Medium SMA (10) and Medium SMA is above Slow SMA (20)
- Exit: Fast SMA crosses below Medium SMA OR Medium SMA crosses below Slow SMA
- Position sizing: 10% of portfolio per trade
"""
params = (
('fast_period', 5),
('medium_period', 10),
('slow_period', 20),
)
def __init__(self):
# Three moving averages
self.sma_fast = bt.indicators.SMA(period=self.p.fast_period)
self.sma_medium = bt.indicators.SMA(period=self.p.medium_period)
self.sma_slow = bt.indicators.SMA(period=self.p.slow_period)
# Crossover indicators
self.cross_fast_medium = bt.indicators.CrossOver(self.sma_fast, self.sma_medium)
self.cross_medium_slow = bt.indicators.CrossOver(self.sma_medium, self.sma_slow)
# Track position for conditional logic
self.position_open = False
def next(self):
# Entry condition: Fast crosses above Medium AND Medium > Slow (no existing position)
if not self.position:
if self.cross_fast_medium > 0 and self.sma_medium[0] > self.sma_slow[0]:
self.buy(size=self.get_target_size()) # Use dynamic sizing
self.position_open = True
# Exit conditions: Fast crosses below Medium OR Medium crosses below Slow
elif self.position_open:
if self.cross_fast_medium < 0 or self.cross_medium_slow < 0:
self.close()
self.position_open = False
def get_target_size(self):
"""Calculate 10% of current portfolio value"""
return int((self.broker.getvalue() * 0.90) / self.data.close[0])
# Initialize Cerebro with strategy and sizer
cerebro = bt.Cerebro()
cerebro.addstrategy(TripleMACross, fast_period=5, medium_period=10, slow_period=20)