@backtrader
Sorry, I may not have described the problem clearly.
class TestStrategy(bt.Strategy):
params = (('pfast', 40), ('pslow', 150),)
def __init__(self):
# To keep track of pending orders and buy price/commission
self.is_order = None
self.trader_price = None
self.risk = 0.05 # risk 10%
self.stop_dist = 0.02 # stoploss distance 5%
self.next_runs = 0
self.dataclose = self.datas[0].close
self.datavolume = self.datas[0].volume
self.pfast = bt.indicators.HullMovingAverage(period=self.p.pfast)
self.pslow = bt.indicators.HullMovingAverage(period=self.p.pslow)
def start(self):
self.counter = 0
print('START')
def prenext(self):
self.counter += 1
def next(self):
if self.live_data:
cash = cerebro.broker.getcash()
if isinstance(cash, str):
print("***** get cash is faild *****")
return
qty = 20 # math.ceil((cash * self.risk * 5000 * 100) / (self.data.close[0]))
print(bt.num2date(self.datetime[0]), "cash=", cash, "size=", qty, "close=", self.data.close[0],
"=", (self.data.close[0] > self.pfast and self.data.close[0] > self.pslow ),
"=", (self.data.close[0] < self.pfast and self.data.close[0] < self.pslow ))
if self.is_order == None and (
self.data.close[0] > self.pfast and self.data.close[0] > self.pslow):
stop_price = round(self.data.close[0] * (1 - self.stop_dist))
qty = 20 # math.ceil((cash * self.risk * 5000 * 100) / (self.data.close[0]))
print(" price=", self.data.close[0], "size=", qty)
try:
self.buy(size=qty, exectype=bt.Order.Market)
except IndexError:
time.sleep(100)
self.buy(size=qty, exectype=bt.Order.Market)
time.sleep(100)
try:
self.sell(exectype=bt.Order.StopLimit, stopPrice=stop_price, price=stop_price,
size=qty)
except IndexError:
time.sleep(100)
self.sell(exectype=bt.Order.StopLimit, stopPrice=stop_price, price=stop_price,
size=qty)
self.trader_price = self.data.close[0]
self.is_order = 'D'
# print("-", self.data.close[0])
if self.is_order == None and (
self.data.close[0] < self.pfast and self.data.close[0] < self.pslow ):
stop_price = round(self.data.close[0] * (1 + self.stop_dist))
qty = 20 # math.ceil((cash * self.risk * 5000 * 100) / (self.data.close[0]))
print(" price=", self.data.close[0], "size=", qty)
try:
self.sell(size=qty, exectype=bt.Order.Market)
except IndexError:
time.sleep(100)
self.sell(size=qty, exectype=bt.Order.Market)
time.sleep(100)
try:
self.buy(exectype=bt.Order.StopLimit, stopPrice=stop_price, price=stop_price,
size=qty)
except IndexError:
time.sleep(100)
self.buy(exectype=bt.Order.StopLimit, stopPrice=stop_price, price=stop_price,
size=qty)
self.trader_price = self.data.close[0]
self.is_order = 'K'
if self.is_order == 'D' and (self.data.close[0] > self.pfast and self.data.close[0] > self.pslow ):
return
elif self.is_order == 'D' and (self.data.close[0] < self.pfast):
try:
self.sell(size=qty, exectype=bt.Order.Market)
print(" price=", self.data.close[0], "size=", qty, "npl=",
self.data.close[0] - self.trader_price)
except IndexError:
time.sleep(100)
self.sell(size=qty, exectype=bt.Order.Market)
print(" price=", self.data.close[0], "size=", qty, "npl=",
self.data.close[0] - self.trader_price)
finally:
self.is_order = None
print('Stopping Backtrader')
self.env.runstop()
if self.is_order == 'K' and (self.data.close[0] < self.pfast and self.data.close[0] < self.pslow ):
# logging.info(bt.num2date(self.datetime[0]), "pass", self.data.close[0])
return
elif self.is_order == 'K' and (self.data.close[0] > self.pfast):
try:
self.buy(size=qty, exectype=bt.Order.Market)
print(" price=", self.data.close[0], "size=", qty, "npl=",
self.trader_price - self.data.close[0])
except IndexError:
time.sleep(100)
self.buy(size=qty, exectype=bt.Order.Market)
print(" price=", self.data.close[0], "size=", qty, "npl=",
self.trader_price - self.data.close[0])
finally:
self.is_order = None
print('Stopping Backtrader')
self.env.runstop()
def notify_data(self, data, status, *args, **kwargs):
dn = data._name
dt = datetime.now()
msg = 'Data Status: {}, Order Status: {}'.format(data._getstatusname(status), status)
print(dt, dn, msg)
if data._getstatusname(status) == 'LIVE':
self.live_data = True
else:
self.live_data = False