首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何利用来自一个符号的SMA信号来交换另一个符号

如何利用来自一个符号的SMA信号来交换另一个符号
EN

Stack Overflow用户
提问于 2021-05-24 21:06:18
回答 1查看 66关注 0票数 1

我的想法是跟踪原油大宗商品价格,并根据油价走势进行ETF交易。

逻辑是:

  • 如果油价突破SMA100上涨趋势,买入ETF
  • ,如果油价突破SMA100下跌趋势,卖出ETF

我使用一个通用的SMA策略,但我不能让它使用石油的数据。基于图,它使用SMA 100作为ETF。

代码语言:javascript
复制
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来指油料数据。不知道我还能在代码中修改什么--我对backtrader相当陌生,可以查看文档。

代码语言:javascript
复制
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()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-25 12:51:59

我想我在文档中找到了一些东西来帮助我解决这个问题:https://www.backtrader.com/blog/posts/2015-09-03-multidata-strategy/multidata-strategy/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67678974

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档