turtle

# 导入函数库
from jqdata import *
from numpy as np
from collections import deque
import math


# 初始化函数,设定基准等等
def initialize(context):
    # 1.设定沪深300作为基准
    set_benchmark('000300.XSHG')
    # 2.开启动态复权模式(真实价格) 防止策略偏离真实
    set_option('use_real_price', True)
    ### 股票相关设定 ###
    # 3.股票类每笔交易时的手续费是:买入时佣金万分之三,卖出时佣金万分之三加千分之一印花税, 每笔交易佣金最低扣5块钱
    set_order_cost(OrderCost(close_tax=0.001, open_commission=0.0003, close_commission=0.0003, min_commission=5), type='stock')
    # 4.设置股票标的
    g.security="000001.XSHE (PAYH)"
    # 5.策略具体变量
    g.in_day=20
    g.out_day=10
    g.today_units=0  #今日持仓数量
    g.current_units=0  #总持仓数量
    g.last_buy_price=0
    g,current_N=0
    g.N=deque(maxlen=19)
    ###初始化编译前N
    for i in range(g.N.maxlen+1,g.N.maxlen*2+1):
        li=[]
        for j in range(i-19,i+1):
            a=price["high"][j]-price["low"][j]
            b=abs(price["high"][j]-price["close"][j-1])
            c=abs(price["close"][j-1]-price["low"][j])
            li.append(max(a,b,c))
        current_N=np.array(li).mean()
        g.N.append(current_N)
def before_trading_start(context):
    # 今日持仓
    g.today_units=0
    # 计算当前N
    g.current_N=cal_N()
def cal_N():
    price = attribute_history("000001.XSHE",2,unit='id',fields=['close','high','low'])
    a=price["high"][1]-price["low"][1]
    b=abs(price["high"][1]-price["close"][0])
    c=abs(price["close"][0]-price["close"][1])
    current_N=(max(a,b,c)+np.array(g.N).sum())/(g.N.maxlen+1)
    g.N.append(current_N)
    return currrent_N

def handle_data(context, data):
    #account
    value = context.portfolio.total_value
    unit = math.floor((0.01*value)/g.current_N)
    cash = context.portfolio.avaliable_cash
    current_price=get_current_data()[g.security].last_price
    #建仓
    if g.current_units==0:
        buy(current_price,cash,unit)
    else:
        if stop_loss(current_price):
            return
        if sell(current_price):
            return
        addin(current_price,cash,unit)
        
def buy(curent_price,cash,unit):
    price=attribute_history(g.security, g.in_day, "id", fields=["high"])
    if current_price > max(price["high"]):
        shares=cash/current_price
        if shares>unit:
            o=order(g.security, unit)
            #更新 
            g.last_buy_price=o.price
            g.current_units+=1
            g.tosay_units+=1
            return True
    return False
    #止盈
def sell(current_price):
    price=attribute_history(g.security, g.out_day, "id", fields=["low"])
    if current_price < min(price["low"]):
        order_target(g.security,0)
        g.current_units=g.today_units
        return True
    return False

    
    #止损
def stop_loss(current_price):
    if current_price < g.last_buy_price-2*g.current_N:
        order_target(g.security,0)
        g.current_units=g.today_units
        return True
    return False    
    
    #加仓
def addin(current_price,cash,unit):
    if current_price > g.last_buy_price+0.5*g.current_N:
        shares=cash/current_price
        if shares > unit:
            o=order(g.security,unit)
            g.last_buy_price=o.price
            g.current_units+=1
            g.today.unit+=1
            return True
        return False
    
    ## 运行函数(reference_security为运行时间的参考标的;传入的标的只做种类区分,因此传入'000300.XSHG'或'510300.XSHG'是一样的)
      # 开盘前运行
    run_daily(before_market_open, time='before_open', reference_security='000300.XSHG')
      # 开盘时运行
    run_daily(market_open, time='open', reference_security='000300.XSHG')
      # 收盘后运行
    run_daily(after_market_close, time='after_close', reference_security='000300.XSHG')

## 开盘前运行函数
def before_market_open(context):
    # 输出运行时间
    log.info('函数运行时间(before_market_open):'+str(context.current_dt.time()))

    # 给微信发送消息(添加模拟交易,并绑定微信生效)
    # send_message('美好的一天~')

    # 要操作的股票:平安银行(g.为全局变量)
    g.security = '000001.XSHE'

## 开盘时运行函数
def market_open(context):
    log.info('函数运行时间(market_open):'+str(context.current_dt.time()))
    security = g.security
    # 获取股票的收盘价
    close_data = get_bars(security, count=5, unit='1d', fields=['close'])
    # 取得过去五天的平均价格
    MA5 = close_data['close'].mean()
    # 取得上一时间点价格
    current_price = close_data['close'][-1]
    # 取得当前的现金
    cash = context.portfolio.available_cash

    # 如果上一时间点价格高出五天平均价1%, 则全仓买入
    if (current_price > 1.01*MA5) and (cash > 0):
        # 记录这次买入
        log.info("价格高于均价 1%%, 买入 %s" % (security))
        # 用所有 cash 买入股票
        order_value(security, cash)
    # 如果上一时间点价格低于五天平均价, 则空仓卖出
    elif current_price < MA5 and context.portfolio.positions[security].closeable_amount > 0:
        # 记录这次卖出
        log.info("价格低于均价, 卖出 %s" % (security))
        # 卖出所有股票,使这只股票的最终持有量为0
        order_target(security, 0)

## 收盘后运行函数
def after_market_close(context):
    log.info(str('函数运行时间(after_market_close):'+str(context.current_dt.time())))
    #得到当天所有成交记录
    trades = get_trades()
    for _trade in trades.values():
        log.info('成交记录:'+str(_trade))
    log.info('一天结束')
    log.info('##############################################################')

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值