8989人阅读 评论(2)

    def onBars(self, bars):# 每一个数据都会抵达这里，就像becktest中的next
# SMA的计算存在窗口，所以前面的几个bar下是没有SMA的数据的.
if self.__sma[-1] is None:
return
#bar.getTyoicalPrice = (bar.getHigh() + bar.getLow() + bar.getClose())/ 3.0

bar = bars[self.__instrument]
# If a position was not opened, check if we should enter a long position.
if self.__position is None:# 如果手上没有头寸，那么
if bar.getPrice() > self.__sma[-1]:
# 开多，如果现价大于移动均线，且当前没有头寸.
self.__position = self.enterLong(self.__instrument, 100, True)
# 当前有多头头寸，平掉多头头寸.
elif bar.getPrice() < self.__sma[-1] and not self.__position.exitActive():
self.__position.exitMarket()
这一部分基本就是交易逻辑。

enterLong(self.__instrument, 100, True)
这就是开多单的命令，第一个就是开多单的标的，100是下单数目，最后一个是allOrNone参数，也就是说，是不是要么全部成交，要么一个不成，默认是false。

    def onEnterOk(self, position):
execInfo = position.getEntryOrder().getExecutionInfo()

def onEnterCanceled(self, position):
self.__position = None

def onExitOk(self, position):
execInfo = position.getExitOrder().getExecutionInfo()
self.info("SELL at $%.2f" % (execInfo.getPrice())) self.__position = None def onExitCanceled(self, position): # If the exit was canceled, re-submit it. self.__position.exitMarket() 基本都是大同小异，功能上没有什么实质性区别。 # 2.SMA策略示例完整代码 # coding=utf-8 from pyalgotrade import strategy from pyalgotrade.bar import Frequency from pyalgotrade.barfeed.csvfeed import GenericBarFeed from pyalgotrade.technical import ma # 1.构建一个策略 class MyStrategy(strategy.BacktestingStrategy): def __init__(self, feed, instrument): super(MyStrategy, self).__init__(feed) self.__position = None self.__sma = ma.SMA(feed[instrument].getCloseDataSeries(), 150) self.__instrument = instrument self.getBroker() def onEnterOk(self, position): execInfo = position.getEntryOrder().getExecutionInfo() self.info("BUY at %.2f" % (execInfo.getPrice())) def onEnterCanceled(self, position): self.__position = None def onExitOk(self, position): execInfo = position.getExitOrder().getExecutionInfo() self.info("SELL at$%.2f" % (execInfo.getPrice()))
self.__position = None

def onExitCanceled(self, position):
# If the exit was canceled, re-submit it.
self.__position.exitMarket()

def onBars(self, bars):# 每一个数据都会抵达这里，就像becktest中的next
# SMA的计算存在窗口，所以前面的几个bar下是没有SMA的数据的.
if self.__sma[-1] is None:
return
#bar.getTyoicalPrice = (bar.getHigh() + bar.getLow() + bar.getClose())/ 3.0

bar = bars[self.__instrument]
# If a position was not opened, check if we should enter a long position.
if self.__position is None:# 如果手上没有头寸，那么
if bar.getPrice() > self.__sma[-1]:
# 开多，如果现价大于移动均线，且当前没有头寸.
self.__position = self.enterLong(self.__instrument, 100, True)
# 当前有多头头寸，平掉多头头寸.
elif bar.getPrice() < self.__sma[-1] and not self.__position.exitActive():
self.__position.exitMarket()

# 2.获得回测数据，官网来源于yahoo，由于墙的关系，我们用本地数据
feed = GenericBarFeed(Frequency.DAY, None, None)

# 3.把策略跑起来

myStrategy = MyStrategy(feed, "fd")
myStrategy.run()
myStrategy.info("Final portfolio value: $%.2f" % myStrategy.getResult())  最后，我们看到把myStrategy.getResult()输出，就可以看到最后我们的资产净值。 2015-08-14 00:00:00 strategy [INFO] BUY at 3976.41 2015-08-19 00:00:00 strategy [INFO] SELL at$3646.80
2016-07-13 00:00:00 strategy [INFO] BUY at 3049.51
2016-08-02 00:00:00 strategy [INFO] SELL at $2950.08 2016-08-03 00:00:00 strategy [INFO] BUY at 2963.22 2016-12-30 00:00:00 strategy [INFO] Final portfolio value:$1394503.20

个人资料
等级：
访问量： 38万+
积分： 5204
排名： 6622
欢迎

#### 个人运营公众号：请搜索：tebs

博客专栏
 R语言的时间序列分析 文章：8篇 阅读：43434 量化回测平台Backtrader教程 文章：9篇 阅读：18440 QuantLib的python使用教程 文章：3篇 阅读：6121 SUMO使用教程 文章：9篇 阅读：22663 和python在一起的日子 文章：15篇 阅读：10829
最新评论