```python
import backtrader as bt
from com.insight import common
from com.insight.query import *
from com.insight.market_service import market_service
from datetime import datetime
def login():
user = ""
password = ""
common.login(market_service, user, password)
class three_bars(bt.Indicator):
lines = ('up', 'down')
def __init__(self):
self.addminperiod(4)
self.plotinfo.plotmaster = self.data
def next(self):
self.up[0] = max(max(self.data.close.get(ago=-1, size=3)), max(self.data.open.get(ago=-1, size=3)))
self.down[0] = min(min(self.data.close.get(ago=-1, size=3)), min(self.data.open.get(ago=-1, size=3)))
class myStrategy(bt.Strategy):
def __init__(self):
self.up_down = three_bars(self.data)
self.buy_signal = bt.indicators.CrossOver(self.data.close, self.up_down.up)
self.sell_signal = bt.indicators.CrossOver(self.data.close, self.up_down.down)
def next(self):
if self.getposition().size >= 0 and self.buy_signal[0] == 1:
self.order = self.buy()
if self.getposition().size < 0 and self.buy_signal[0] == 1:
self.order = self.close()
self.order = self.buy()
if self.getposition().size <= 0 and self.sell_signal[0] == -1:
self.order = self.sell()
if self.getposition().size > 0 and self.sell_signal[0] == -1:
self.order = self.close()
self.order = self.sell()
if __name__ == '__main__':
login()
cerebro = bt.Cerebro()
df = get_kline(htsc_code=["000001.SZ"], time=[datetime(2021, 5, 10), datetime(2022, 5, 10)],
frequency="daily", fq="none")
data = bt.feeds.PandasData(
dataname=df,
fromdate=datetime(2021, 5, 10),
todate=datetime(2022, 5, 10),
datetime='time',
open='open',
high='high',
low='low',
close='close',
volume='volume',
openinterest=-1
)
cerebro.adddata(data, name="daily_kline")
cerebro.addstrategy(myStrategy)
result = cerebro.run()
cerebro.plot()