import time
import os
import csv
import numpy as np
import math
import talib as ta
from datetime import date
def init(context):
# 在context中设置一些参数
context.s1 = context.universe
#价格时间周期长度,其中包括了当日价格,所以要选取N天前的数据,则需要N+1
context.period =1000
context.code=[]
#print(context.universe) 查看是否能读取合约池里的股票,成功
# before_trading此函数会在每天策略交易开始前被调用,当天只会被调用一次
def before_trading(context):
pass
# 你选择的证券的数据更新将会触发此段逻辑,例如日或分钟历史数据切片或者是实时数据切片更新
def handle_bar(context):
# 开始编写你的主要的算法逻辑
# bar_dict[order_book_id] 可以拿到某个证券的bar信息
# context.portfolio 可以拿到现在的投资组合信息
# 使用order_shares(id_or_ins, amount)方法进行落单
# TODO: 开始编写你的算法吧!
#价格时间周期长度,其中包括了当日价格,所以要选取N天前的数据,则需要N+1
#金字塔的时间序列是正向序列,是按远到近排序的,为了方便可以反向取值
for id in context.s1:
try:
close = history_bars(id,200, '1d', 'close') #股票收盘价时间序列
open = history_bars(id,50, '1d', 'open') #股票开盘价时间序列
low = history_bars(id,50, '1d', 'low')
count=0 #用来统计前三天low小于MAX的天数
buy_quantity=get_portfolio(id,2).buy_quantity #持仓数量
pnl=get_portfolio(id,2).pnl #收益盈亏
holding_price=get_portfolio(id,2).buy_avg_holding_price #持仓成本
close_today=close[-1] #当前的收盘价,如果还在交易时间内,则显示的是当前价格
close_yesterday=close[-2] #昨天的收盘价
ma10=ta.SMA(close,10) #10日简单移动平均线
ma60=ta.SMA(close,60) #200日简单移动平均线
EMA13=ta.EMA(close,13) #13日指数移动平均线
EMA25=ta.EMA(close,25) #25日指数移动平均线
MAX=max(EMA13[-1],ma10[-1])
#print(context.now)
#print(close_yesterday)
#print(EMA13[-1])
#print(EMA25[-1])
#print(ma200[-1])
#print(ma10[-1])
#print(open[-1])
#print(max(EMA13[-1],ma10[-1]))
#print(low[-1]);
for i in range(3):
if low[-1-i]<max(EMA13[-1-i],ma10[-1-i]):
count=count+1
else:
pass
#print(count)
if buy_quantity==0:
if close_yesterday>EMA13[-1] and EMA13[-1]>=EMA25[-1] and close_today>ma60[-1] and close_yesterday>ma10[-1] and open[-1]>=MAX and low[-1]<=MAX and count==1:
buy_open(id,"Market",0 ,0,100000,serial_id = 1)
#print("EMA策略购买")
#print(1)
if buy_quantity!=0:
if (pnl/(holding_price*buy_quantity))>0.2 or (pnl/(holding_price*buy_quantity))<-0.08:
#print(id) #和下面式子一起使用可以看哪只股票盈亏多少
#print(pnl/(holding_price*buy_quantity))
sell_close (id,"Market",0,buy_quantity,0)
except:
pass
#print(portfolio.buy_quantity)
#print(portfolio.buy_avg_holding_price)
#print(portfolio.buy_avg_holding_price)
# after_trading函数会在每天交易结束后被调用,当天只会被调用一次
def after_trading(context):
pass