如何使用一个交易品种的 SMA 信号来交易另一个交易品种
How to use SMA signal from one symbol to trade another symbol
我的想法是跟踪原油商品价格并根据石油的走势交易 ETF。
逻辑是:
- 如果石油价格穿越 SMA100 上升趋势,买入 ETF
- 如果价格穿过 SMA100 油价下跌趋势,卖出 ETF
我使用通用 SMA 策略,但我无法让它使用来自石油的数据。根据图表,它使用 SMA 100 作为 ETF。
import backtrader as bt
import datetime
start = datetime.datetime(2018,1,1)
end = datetime.datetime(2021,5,1)
cerebro = bt.Cerebro()
cerebro.broker.set_cash(1000000)
etf = bt.feeds.YahooFinanceData(dataname='SUSW.L', fromdate=start,
todate=end)
oil = bt.feeds.YahooFinanceData(dataname='CL=F', fromdate=start,
todate=end)
cerebro.adddata(etf, name='etf')
cerebro.adddata(oil, name='oil')
我使用 data1 来引用 Oil 数据源。不确定我还可以在代码中更改什么 - 我是 backtrader 的新手并查看文档。
class SmaCross(bt.Strategy):
def log(self, txt, dt=None):
''' Logging function for this strategy'''
dt = dt or self.datas[0].datetime.date(0)
print('%s, %s' % (dt.isoformat(), txt))
params = (
('sma_fast', 50),
('sma_slow', 100),
('macro', 100)
)
def __init__(self):
#sma1 = bt.ind.SMA(period= self.params.sma_fast) # fast moving average
#sma2 = bt.ind.SMA(period= self.params.sma_slow) # slow moving average
sma_macro = bt.ind.SMA(period= self.params.macro)
self.macro = self.data1.close
self.crossover_macro = bt.ind.CrossOver(self.macro, sma_macro)
def notify_order(self, order):
if order.status in [order.Submitted, order.Accepted]:
return
if order.status in [order.Completed]:
if order.isbuy():
self.log('BUY EXECUTED {}'.format(order.executed.price))
elif order.issell():
self.log('SELL EXECUTED {}'.format(order.executed.price))
def next(self):
if not self.position: # not in the market
if self.crossover_macro < 0:
self.buy()
elif self.crossover_macro > 0:
self.close()
cerebro.addstrategy(SmaCross, oil = 100)
cerebro.addsizer(bt.sizers.PercentSizer, percents=20)
cerebro.run()
cerebro.plot()
我想我在文档中找到了一些可以帮助我解决这个问题的东西:https://www.backtrader.com/blog/posts/2015-09-03-multidata-strategy/multidata-strategy/
我的想法是跟踪原油商品价格并根据石油的走势交易 ETF。
逻辑是:
- 如果石油价格穿越 SMA100 上升趋势,买入 ETF
- 如果价格穿过 SMA100 油价下跌趋势,卖出 ETF
我使用通用 SMA 策略,但我无法让它使用来自石油的数据。根据图表,它使用 SMA 100 作为 ETF。
import backtrader as bt
import datetime
start = datetime.datetime(2018,1,1)
end = datetime.datetime(2021,5,1)
cerebro = bt.Cerebro()
cerebro.broker.set_cash(1000000)
etf = bt.feeds.YahooFinanceData(dataname='SUSW.L', fromdate=start,
todate=end)
oil = bt.feeds.YahooFinanceData(dataname='CL=F', fromdate=start,
todate=end)
cerebro.adddata(etf, name='etf')
cerebro.adddata(oil, name='oil')
我使用 data1 来引用 Oil 数据源。不确定我还可以在代码中更改什么 - 我是 backtrader 的新手并查看文档。
class SmaCross(bt.Strategy):
def log(self, txt, dt=None):
''' Logging function for this strategy'''
dt = dt or self.datas[0].datetime.date(0)
print('%s, %s' % (dt.isoformat(), txt))
params = (
('sma_fast', 50),
('sma_slow', 100),
('macro', 100)
)
def __init__(self):
#sma1 = bt.ind.SMA(period= self.params.sma_fast) # fast moving average
#sma2 = bt.ind.SMA(period= self.params.sma_slow) # slow moving average
sma_macro = bt.ind.SMA(period= self.params.macro)
self.macro = self.data1.close
self.crossover_macro = bt.ind.CrossOver(self.macro, sma_macro)
def notify_order(self, order):
if order.status in [order.Submitted, order.Accepted]:
return
if order.status in [order.Completed]:
if order.isbuy():
self.log('BUY EXECUTED {}'.format(order.executed.price))
elif order.issell():
self.log('SELL EXECUTED {}'.format(order.executed.price))
def next(self):
if not self.position: # not in the market
if self.crossover_macro < 0:
self.buy()
elif self.crossover_macro > 0:
self.close()
cerebro.addstrategy(SmaCross, oil = 100)
cerebro.addsizer(bt.sizers.PercentSizer, percents=20)
cerebro.run()
cerebro.plot()
我想我在文档中找到了一些可以帮助我解决这个问题的东西:https://www.backtrader.com/blog/posts/2015-09-03-multidata-strategy/multidata-strategy/