- OpenBacktesting
- composable_strategies.py
composable_strategies.py¶
Source: examples/advanced/composable_strategies.py
"""Combine SignalStrategy and TrailingStrategy: vector entry signals with a trailing stop.
Bundled GOOG daily data, with no additional dependencies; n1/n2 are fast/slow SMA periods. Call super when overriding init/next.
Long only; each request uses 95% of equity, with a 2 ATR trailing stop and 0.2% commission.
No forced end-of-run liquidation. Explicitly run main to print statistics; a stop does not guarantee profit.
"""
import pandas as pd
from openbacktesting import Backtest
from openbacktesting.lib import SignalStrategy, TrailingStrategy
from openbacktesting.test import GOOG
class SmaCross(SignalStrategy, TrailingStrategy):
n1 = 10
n2 = 25
def init(self):
super().init()
sma1 = self.ta.sma(self.close, length=self.n1)
sma2 = self.ta.sma(self.close, length=self.n2)
signal = (pd.Series(sma1) > sma2).astype(int).diff().fillna(0)
signal = signal.replace(-1, 0)
self.entry_signal = signal.to_numpy()
self.set_trailing_sl(2)
def next(self):
super().next()
if self.entry_signal[len(self.data) - 1] > 0:
self.buy(percent=95)
def main():
stats = Backtest(GOOG, SmaCross, commission=0.002).run()
print(stats)
return stats
if __name__ == "__main__":
main()