金字塔决策交易系统

 找回密码
 

微信登录

微信扫一扫,快速登录

搜索

1-99个策略库优化跟单评估交易系统python+pel策略库

[复制链接]

3

主题

76

帖子

76

积分

等级: 免费版

注册:
2021-7-16
曾用名:
 楼主| 发表于 2022-8-27 22:22 来自手机 | 显示全部楼层
扩展库参数功能。看懂的自己布局整理
image.jpg
回复

使用道具 举报

3

主题

76

帖子

76

积分

等级: 免费版

注册:
2021-7-16
曾用名:
 楼主| 发表于 2022-8-27 22:29 来自手机 | 显示全部楼层
下一步计划。机器学习用起来。上面改变了添加参数周期判断配合。自行修改DK。
image.jpg
回复

使用道具 举报

3

主题

76

帖子

76

积分

等级: 免费版

注册:
2021-7-16
曾用名:
 楼主| 发表于 2022-8-29 16:54 | 显示全部楼层
                    context.Bar = context.run_info.frequency    #python 运行当前周期指向pel策略计算参数
                    context.BarLen = 1
                    #context.S0 = context.run_info.base_book_id
                    context.NameS0 = get_dynainf(context.S0,219)    #合约池名称
                    context.DataTime = (history_bars(context.S0,context.BarLen,context.Bar,'datetime',True,True)) #(history_bars(s,BarLen,Bar,'datetime',True,True))
                    context.DataTime = int(context.DataTime)
                    context.Year = str(context.DataTime)[0:4]
                    context.Month = str(context.DataTime)[4:6]
                    context.Day = str(context.DataTime)[6:8]
                    context.Time = str(context.DataTime)[8:]
                    context.Date = str(context.DataTime)[0:8]
                    #print(context.DataTime)
                    #context.Date = datetime.datetime.now().strftime('%y-%m-%d')    #时间
                    #context.Time = datetime.datetime.now().strftime('%H:%M:%S')    #时间

                    context.NewAmountFuDongYingKui = get_account(4)        #4 当前交易帐户中的浮动盈亏
                    context.NewAmount = get_account(6)                    #6 当前交易帐户中的动态权益/资产值
                    context.KeYongAmount = get_account(19)                #19 当前可用资金
                    context.OrdAmount = get_account(26)                    #26 上次结算准备金/期初余额
                    context.BaoZhengJinAmount = get_account(28)            #28 占用保证金/证券市值
                    context.NewAmountPingCangYingKui = get_account(30)  #30 平仓盈亏数额/回报卖出金额/融券盈亏
                    context.NewAmountShouXuFei = get_account(31)        #31 当前交易帐户中的手续费
                    context.ZongYinKuiAmount = (context.NewAmountFuDongYingKui \
                                                + context.NewAmountPingCangYingKui \
                                                - context.NewAmountShouXuFei)    #账户总盈亏   
                    if context.HighAmount==0:
                        context.HighAmount=context.OrdAmount
                    if context.LowAmount==0:
                        context.LowAmount=context.OrdAmount
                    if context.NewAmount>=context.HighAmount:
                        context.HighAmount = context.NewAmount   
                    if context.NewAmount<=context.LowAmount:
                        context.LowAmount = context.NewAmount
                    print('py_Amount/def before_trading(context):/context.HighAmount='+str(context.HighAmount)+'/context.LowAmount='+str(context.LowAmount)+'/context.NewAmount='+str(context.NewAmount))   
                    if 1!=0:
                        pass
                        if 1!=0:
                            pass
                            if 1!=0:
                                pass
                                if 1!=0:
                                    pass   
                                    context.DataName =\
                                            str('日期'),\
                                            str('时间'),\
                                            str('总盈亏'),\
                                            str('浮动盈亏'),\
                                            str('平仓盈亏'),\
                                            str('手续费'),\
                                            str('可用资金'),\
                                            str('占用保证金'),\
                                            str('动态权益'),\
                                            str('上次结算准备金'),\
                                            str('HIGH结算准备金'),\
                                            str('LOW结算准备金')

                                    pass
                                    context.Data = ['\n',\
                                            context.Date,\
                                            context.Time,\
                                            context.ZongYinKuiAmount,\
                                            context.NewAmountFuDongYingKui,\
                                            context.NewAmountPingCangYingKui,\
                                            context.NewAmountShouXuFei,\
                                            context.KeYongAmount,\
                                            context.BaoZhengJinAmount,\
                                            context.NewAmount,\
                                            context.OrdAmount,\
                                            context.HighAmount,\
                                            context.LowAmount,\
                                            ]
                                            
                                    context.RiQi = context.Account+'_'+str(context.Date)    #日期
                                    #print(RiQi)
                                    context.WenJianMing = 'C:\py_Amount_64_'+context.RiQi+'.txt'
                                    #context.WenJianMing = WenJianMing
                                    #print(str(context.Time)+':'+context.WenJianMing)         
                                    #if 1 >= int(datetime.datetime.now().strftime('%d')) >= 0: #新文件0时-5分钟创建开始写表头
                                    if 10500 >= int(context.Time) >= 10000:
                                        with open(context.WenJianMing,'w',encoding='utf-8') as f:    #使用with open()新建对象f, 'w'= 覆盖
                                            f.write(','+str(context.DataName))    #覆盖写入表头最上层
                                            pass
                                    elif 190000 > int(context.Time) > 10500:
                                        with open(context.WenJianMing,'a',encoding='utf-8') as f:    #开始添加记录表头数据 'a'=添加
                                            for index in context.Data:
                                                #print(str(i))
                                                f.write(','+str(index))    #写入数据,文件保存在上面指定的目录,加\n为了换行更方便阅读
                                        if 1!=0:
                                            pass
                                            if 1!=0:
                                                pass
                                                if 1!=0:
                                                    pass
                                                    if 1!=0:
                                                        pass
                                                        if 1!=0:
                                                            pass

补充内容 (2022-8-30 22:16):
一个记录日内曲线的小模块,方便分析日内交易形成的曲线,形成txt文件,方便转换表格和分析作图,每日一个自动写入txt,如果需要更详细的,设置周期1分钟,一般5分钟就行了,
原生支持,不需要pip install  安装第三方库
回复

使用道具 举报

3

主题

76

帖子

76

积分

等级: 免费版

注册:
2021-7-16
曾用名:
 楼主| 发表于 2022-8-29 17:20 | 显示全部楼层
模拟盘运行版本.不支持实盘交易,仅供测试模拟盘和优化交易策略库

补充内容 (2022-8-29 17:23):
改版了DK.fla 加入了参数定义不同的周期,方便优化策略库里的每一个策略做周期分类管理评估

补充内容 (2022-8-31 09:18):
    input_par('DateEnd',20220831,20000101,20221231,1)  #自动停止结束日期
    input_par("Account",888888,1,999999,1)     #模拟盘登录账户号码,判断:回测(退出=不转换主力合约) / 实盘(登录=转换主力合约)
    input_par('DK',0,-1,1,1)            #pel策略 1=多 2=空 0=多空
    input_par('PEL',21,1,99,1)            #控制pel策略库号码 1-99
    input_par('PELAsset',1000,100,1000,100)    #Pel配置的初始化总金额/万
    input_par('HoldVol',5,1,9,1)    #持仓量,判断交易品种活跃度/万
    input_par('MaxAmount',10,1,100,1)    #策略配置运行交易持仓最大金额/万   
    input_par('Amount',5,1,20,1)    #策略配置运行交易每个品种持仓最大金额/万
    input_par('LenAmount',3,1,20,1)    #策略配置运行交易品种最大保证金/万/张
    input_par('Win',10,1,10,1)        #日内最大盈利%
    input_par('Loss',1,1,10,1)   #日内最大回撤%

补充内容 (2022-8-31 09:27):
    input_par('DateEnd',20220831,20000101,20221231,1)  #自动停止结束日期
    input_par("Account",888888,1,999999,1)     #模拟盘登录账户号码,判断:回测(退出=不转换主力合约) / 实盘(登录=转换主力合约)
    input_par('DK',0,-1,1,1)            #pel策略 1=只开多平多 -1=只开空平空 0=自动单项开多平多开空平空
    input_par('PEL',21,1,99,1)            #控制pel策略库号码 1-99
    input_par('PELAsset',1000,100,1000,100)    #Pel配置的初始化总金额/万
    input_par('HoldVol',5,1,9,1)    #持仓量,判断交易品种活跃度/万
    input_par('MaxAmount',10,1,100,1)    #策略配置运行交易持仓最大金额/万   
    input_par('Amount',5,1,20,1)    #策略配置运行交易每个品种持仓最大金额/万
    input_par('LenAmount',3,1,20,1)    #策略配置运行交易品种最大保证金/万/张
    input_par('Win',10,1,10,1)        #日内最大盈利%
    input_par('Loss',1,1,10,1)   #日内最大回撤%

补充内容 (2022-9-20 14:44):
此版本运行一个kd.py只能开仓一张下单,如果想开仓多少张,运行多个kd.py就可以了.修改对应的参数就可以了.又不明白的反馈我...

补充内容 (2022-11-12 16:01):
最新版 20221108 见 32楼发布的系统
极速版

KD无怨码20220828.zip

442.81 KB, 下载次数: 17205

回复

使用道具 举报

3

主题

76

帖子

76

积分

等级: 免费版

注册:
2021-7-16
曾用名:
 楼主| 发表于 2022-8-29 17:33 | 显示全部楼层
山东淄博MeRobot 发表于 2022-8-29 17:20
模拟盘运行版本.不支持实盘交易,仅供测试模拟盘和优化交易策略库

补充内容 (2022-8-29 17:23):

模拟盘运行KF.jpy的周期就同步穿透到指定的策略库号码对应的那个交易策略,
没有使用跨周期相关的函数.计算更快一点.
回复

使用道具 举报

3

主题

76

帖子

76

积分

等级: 免费版

注册:
2021-7-16
曾用名:
 楼主| 发表于 2022-9-4 11:14 来自手机 | 显示全部楼层
99个交易策略同时计算,大概需要300秒左右吧。可以做交易策略优选投资那个品种了
image.jpg
回复

使用道具 举报

3

主题

76

帖子

76

积分

等级: 免费版

注册:
2021-7-16
曾用名:
 楼主| 发表于 2022-9-4 12:06 来自手机 | 显示全部楼层
自动化管理交易策略框架。下一步计划
image.jpg
回复

使用道具 举报

3

主题

76

帖子

76

积分

等级: 免费版

注册:
2021-7-16
曾用名:
 楼主| 发表于 2022-9-5 22:22 | 显示全部楼层
    #print('def parameter():pass')
    input_par('DateStart',20220801,20000101,20221231,1)  #自动运行开启日期
    input_par('DateEnd',20220931,20000101,20221231,1)  #自动停止结束日期
    input_par("Account",888888,1,999999,1)     #模拟盘登录账户号码,判断:回测(退出=不转换主力合约) / 实盘(登录=转换主力合约)
    pass
    input_par('PELAsset',1000,100,1000,100)    #Pel配置的初始化总金额/万
    input_par('PEL',0,0,99,1)            #控制pel策略库号码 1-99 0=全部 1-99 自动
    input_par('DK',0,-1,1,1)            #控制pel策略 1=只开多平多 -1=只开空平空 0=自动单项开多平多开空平空
    input_par('GangGan',7,1,100,1)    #控制pel策略 杠杆参数
    input_par('BiLi',10,1,100,1)    #控制pel策略 比例金额参数
    input_par('LowHoldVol',5,1,9,1)    #控制pel最低持仓量,判断交易品种活跃度/万
    input_par('HighHoldVol',99,1,99,1)    #控制pel最高持仓量,判断交易品种活跃度/万   
    pass
    input_par('MaxAmount',10,1,100,1)    #策略配置运行交易持仓最大金额/万   
    input_par('Amount',5,1,20,1)    #策略配置运行交易每个品种持仓最大金额/万
    input_par('LenAmount',3,1,20,1)    #策略配置运行交易品种最大保证金/万/张
    input_par('Win',10,1,10,1)        #日内最大盈利%
    input_par('Loss',1,1,10,1)   #日内最大回撤%

补充内容 (2022-9-5 22:26):
        if context.PEL == 0:
            PEL1 = 1
            PEL99 = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,\
                    22,23,24,25,26,27,28,29,30,\
                    31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,\
                    90,91,92,93,94,95,96,97,98,99,\
                    ]
        if context.PEL != 0:
            PEL1 = [context.PEL]
            PEL99 = [context.PEL]  
        #handle_bar_start1 = (datetime.datetime.now().strftime('%H%M%S'))
        for index in PEL99:        #每次循环合约池
            handle_bar_end1 = (datetime.datetime.now().strftime('%H%M%S'))
            start_end_time1 = int(handle_bar_end1) - int(handle_bar_start1)
            handle_bar_start1 = (datetime.datetime.now().strftime('%H%M%S'))
            #context.PEL0 =[]
            context.PEL1 = (index)            
            #print(context.PEL99)
            context.PEL0 = '%d,%d,%d,%d,%d,%d'%(context.PEL1,context.DK,context.GangGan,context.BiLi,context.LowHoldVol,context.HighHoldVol)  
            #DK(21,0,7,10,5,99):PEL=(1-99),多空=(-1,0,1),杠杆比例=(1-20),金额比例=(1-20),持仓LOW=(1-99),持仓HIGH=(1-99)

补充内容 (2022-9-5 22:30):
########################## PEl指令模板 ########################
    '''
    {}
    CYC:BARSLAST(DATE<>REF(DATE,1))+1,NOAXIS,LINETHICK0;
    手数:CEILING((7 * 100000)/(CLOSE * MULTIPLIER));     //等额手数 //下单手数
    {}
    平空:SELLSHORT(PK AND HOLDING<0,手数,THISCLOSE);                  //平空信号
    开多:BUY(KD AND HOLDING<=0,手数,THISCLOSE);          //开多信号
    平多:SELL(PD AND HOLDING>0,手数,THISCLOSE);                       //平多信号
    开空:BUYSHORT(KK AND HOLDING>=0,手数,THISCLOSE);     //开空信号
    {}
    配资:REF(OPENASSET,CYC),NOAXIS,LINETHICK0;
    高资:HHV(OPENASSET,CYC),NOAXIS,LINETHICK0;
    低资:LLV(OPENASSET,CYC),NOAXIS,LINETHICK0;
    持仓:HOLDING,,NOAXIS,LINETHICK0;
    前资产:OPENASSET,NOAXIS,,LINETHICK0;
    当前资产:ASSET,NOAXIS,,LINETHICK0;
    当前持仓:HOLDING,,NOAXISLINETHICK0;
    可用现金:(CASH(0)+CASH(1))/2,NOAXIS,LINETHICK0;
    {}


补充内容 (2022-9-5 22:31):
if start_end_time1 > 10:
                print(str(context.PEL0)+'/耗时:'+str(start_end_time1)+'秒:1-99/OK')
            pass
            context.NewDataTime = int(history_bars(context.run_info.base_book_id,1,context.Bar,'datetime',True,True))
            context.NewDate = str(context.NewDataTime)[0:8]
            #print(context.Date)
            context.DateEndOn = int(context.NewDate) < context.DateStart or int(context.NewDate) > context.DateEnd
            context.DateEndOff =  int(context.NewDate) >= context.DateStart and int(context.NewDate) <= context.DateEnd
            pass

补充内容 (2022-9-6 10:15):
def order_status(context,order):
    pass
    if 1 != 0:
        if 1!= 0:
            if 1!= 0:
                if 1!= 0:
                    if 1!= 0:
                        if context.test==0:
                            #=====================================如果最近一次订单状态为未成交,则进行撤单操作
                            id_list = get_orders(order_book_id = "all", type = 1, account = "")
                            if not(get_orders(order_book_id = "all", type = 1, account = "") == None):
                                id_last = get_orders_id (id_list[-1].order_id)
                                #如果最近一次订单状态为未成交,则进行撤单操作。
                                if  id_last.status =='submitted':
                                    time.sleep(100)
                                    cancel_order(id_last.order_id)
                                    #print('如果最近一次订单状态为未成交,则进行撤单操作。')
                                    pass

补充内容 (2022-9-6 10:17):
def order_status(context,order):
    pass
    if 1 != 0:
        if 1!= 0:
            if 1!= 0:
                if 1!= 0:
                    if 1!= 0:
                        if context.test==0:
                            #=====================================如果最近一次订单状态为未成交,则进行撤单操作
                            id_list = get_orders(order_book_id = "all", type = 0, account = context.Account)
                            if not(id_list == None):
                                '''
                                for i in id_list:
                                    write_logging(str(i.datetime))
                                '''
                                id_last_1 = get_orders_id (id_list[-1].order_id)
                                #如果最近一次订单状态为未成交,则进行撤单操作。
                                if  id_last_1.status =='submitted':
                                    pass
                                    write_logging(str(id_last_1.datetime))
                                    if 1 != 0:
                                    #if int(id_last.datetime) < int(context.NewDataTime) - 30000:
                                        time.sleep(30)
                                        cancel_order(id_last_1.order_id)
                                        #print('如果最近一次订单状态为未成交,则进行撤单操作。')
                                        pass

补充内容 (2022-9-6 10:43):
自动撤单延时模块
time.sleep(30) 超过30秒没有成交自动撤单

补充内容 (2022-9-6 10:45):
context.test==0:交易模式,
context.test==1: 回测模式不进行撤单.回测会变慢.跳过检测

补充内容 (2022-9-6 10:49):
补充内容 (2022-9-5 22:26):
  if context.PEL == 0:
自动循环1-99给pel指标交易策略对合约池所有品种计算,
  if context.PEL != 0:
指定pel号码交易策略对合约池所有品种计算.

补充内容 (2022-9-6 10:50):
#print('def parameter():pass')
    input_par('DateStart',20220801,20000101,20221231,1)  #自动运行开启日期
    input_par('DateEnd',20220931,20000101,20221231,1)  #自动停止结束日期
增加日期计划交易控制

补充内容 (2022-9-6 10:53):
补充内容 (2022-9-5 22:30):
########################## PEl指令模板 ########################
对py输出pel计算结果分析评估和跟单

补充内容 (2022-9-6 10:55):
pel编写必须符合上面的格式和解释,否则py没办法评估这个pel交易策略的好和坏,无法跟单.
回复

使用道具 举报

3

主题

76

帖子

76

积分

等级: 免费版

注册:
2021-7-16
曾用名:
 楼主| 发表于 2022-9-6 13:21 | 显示全部楼层
#Py_Amount 记录绘制日内资金曲线反馈与分析
# 本Python代码主要用于策略交易
# 可以自己import我们平台支持的第三方python模块,比如pandas、numpy等。
#from PythonApi import *
import datetime     #python 原生内置日期模块
import time        #python 原生内置时间模块
import random        #python 原生内置随机模块
import math
#import numpy as np                # 导入模块 numpy,并简写成 np
#print(np)
#import pandas as pd               # 导入模块 pandas,并简写成 pd
#print(pd)
#import matplotlib.pyplot as plt   # 导入模块 matplotlib.pyplot,并简写成 plt
#print(plt)
#%matplotlib inline
#本文代码在jupyter notebook中运行,最后一行魔法命令,可以在画图时结尾不需要plt.show()
#plt.rcParams['font.sans-serif'] = ['FangSong']    #中文支持
#plt.rcParams['axes.unicode_minus'] = False
###############################################################
#import math
#from sklearn.svm import SVR
#from sklearn.model_selection import GridSearchCV
#from sklearn.model_selection import learning_curve
#from sklearn.linear_model import LinearRegression
#from sklearn.ensemble import RandomForestRegressor
#########################################################################################################
#  参数定义区,这里定义的参数可以直接在context对象中获取。--(选择实现)
def parameter():
    input_par("Account",257205,1,9999999999,1)
    input_par("WinLossBi",0,-100,100,1)
    input_par("StopWin",0.01,0.01,1,0.01)
    input_par("StopLoss",0.01,0.01,1,0.01)
    input_par("Repeat",0,0,1,1)

#    input_par("myvalues2",10,1,20,1)
#  在这个方法中编写任何的初始化逻辑。context对象将会在你的算法策略的任何方法之间做传递。--(必须实现)
def init(context):
    context.HighAmount = 0
    context.LowAmount = 0
    context.Account = str(context.Account)
    context.WinLossBi =(context.WinLossBi)
    context.StopWin = (context.StopWin)
    context.StopLoss = (context.StopLoss)
    context.Repeat = (context.Repeat)
    if context.WinLossBi == 0:
        context.StopWin = (context.StopWin)
        context.StopLoss = (context.StopLoss)
    if context.WinLossBi > 0:
        context.StopWin = (context.StopWin) * abs(context.WinLossBi)
        context.StopLoss = (context.StopLoss)
    if context.WinLossBi < 0:
        context.StopWin = (context.StopWin)
        context.StopLoss = (context.StopLoss) * abs(context.WinLossBi)
    context.StopLoss = -(context.StopLoss)     
    print('AmountToExel/设置交易账户:'+str(context.Account)+'/设置盈亏比:'+str(context.WinLossBi)+'/品种设置止盈率/StopWin:'+str(context.StopWin)+'/品种设置止损率/StopLoss:'+str(context.StopLoss))   
    # 在context中保存全局变量
    #context.S = "SQAG00"   #平安银行股票   
    # print("策略启动") #调试打印输出
    pass
# before_trading此函数会在每天基准合约的策略交易开始前被调用,当天只会被调用一次。--(选择实现)
def before_trading(context):
    pass
   
# 你选择的品种的数据更新将会触发此段逻辑,例如日或分钟历史数据切片或者是实时数据切片更新。--(必须实现)
def handle_bar(context):
    pass   
    #print('/设置交易账户:'+str(context.Account)+'/设置盈亏比:'+str(context.WinLossBi)+'/品种设置止盈率/StopWin:'+str(context.StopWin)+'/品种设置止损率/StopLoss:'+str(-context.StopLoss))           
    # 开始编写你的主要的算法逻辑。
    #使用buy_open、sell_close等方法下单
    #下单示例:
    #buy_open(context.S, "Market", volume = 100)    #  市价开多
    #buy_open(context.S, "Limit", 25.45, 100)       #  限价开多
    pass
    #GetAccountBook = len(get_account_book())    #账户列表
    #print('账户列表:'+str(GetAccountBook))
    #AccountBook = (isaccount())        #登录账户
    #print('登录账户:'+str(AccountBook))
    #IsAccount = isaccount(context.Account)
    #print(isaccount(context.Account))
    #if isaccount(context.Account) == 1:
    #    print('/登录账户:'+context.Account+'/有效帐号:'+str(IsAccount))
    #    pass
    #if isaccount() == 0:
    #    write_logging('/登录账户:[Account]未登录')
        #print('/登录账户:'+context.Account+'/未登录:'+str(IsAccount))
    #    return     
    #elif isaccount(context.Account) == 0:
    #    write_logging('/登录账户:[Account]帐号设置无效')
        #print('/登录账户:'+context.Account+'/无效帐号:'+str(IsAccount))
    #    return      
    if get_account(6) == 255 or get_account(26) == 255 or get_account(19) == 255:
        #write_logging('AmountToExel/账户异常!未登录!退出交易!')
        #return
        pass
    else:   
        context.S0 = 'SQAG00'
        if context.run_info.base_book_id != context.S0:
            write_logging('AmountToExel/设置基准合约为[白银连续(SQAG00)]设置无效')
            #return
            pass
        if not istradertime(context.S0):
            #write_logging('AmountToTxt/设置基准合约为[白银连续(SQAG00)]非交易时间')
            #return
            pass
        else:   
            if 1!=0:
                pass
                if 1!=0:
                    context.Bar = context.run_info.frequency    #python 运行当前周期指向pel策略计算参数
                    context.BarLen = 1
                    #context.S0 = context.run_info.base_book_id
                    context.NameS0 = get_dynainf(context.S0,219)    #合约池名称
                    context.DataTime = (history_bars(context.S0,context.BarLen,context.Bar,'datetime',True,True)) #(history_bars(s,BarLen,Bar,'datetime',True,True))
                    context.DataTime = int(context.DataTime)
                    context.Year = str(context.DataTime)[0:4]
                    context.Month = str(context.DataTime)[4:6]
                    context.Day = str(context.DataTime)[6:8]
                    context.Time = str(context.DataTime)[8:]
                    context.Date = str(context.DataTime)[0:8]
                    #print(context.DataTime)
                    #context.Date = datetime.datetime.now().strftime('%y-%m-%d')    #时间
                    #context.Time = datetime.datetime.now().strftime('%H:%M:%S')    #时间

                    context.NewAmountFuDongYingKui = get_account(4)        #4 当前交易帐户中的浮动盈亏
                    context.NewAmount = get_account(6)                    #6 当前交易帐户中的动态权益/资产值
                    context.KeYongAmount = get_account(19)                #19 当前可用资金
                    context.OrdAmount = get_account(26)                    #26 上次结算准备金/期初余额
                    context.BaoZhengJinAmount = get_account(28)            #28 占用保证金/证券市值
                    context.NewAmountPingCangYingKui = get_account(30)  #30 平仓盈亏数额/回报卖出金额/融券盈亏
                    context.NewAmountShouXuFei = get_account(31)        #31 当前交易帐户中的手续费
                    context.ZongYinKuiAmount = (context.NewAmountFuDongYingKui \
                                                + context.NewAmountPingCangYingKui \
                                                - context.NewAmountShouXuFei)    #账户总盈亏   
                    if context.HighAmount==0:
                        context.HighAmount=context.OrdAmount
                    if context.LowAmount==0:
                        context.LowAmount=context.OrdAmount
                    if context.NewAmount>=context.HighAmount:
                        context.HighAmount = context.NewAmount   
                    if context.NewAmount<=context.LowAmount:
                        context.LowAmount = context.NewAmount
                    #if context.NewAmount<=context.LowAmount:
                    #    print('AmountToExel/def before_trading(context):/context.HighAmount='+str(context.HighAmount)+'/context.LowAmount='+str(context.LowAmount)+'/context.NewAmount='+str(context.NewAmount))   
                    if 1!=0:
                        pass
                        if 1!=0:
                            pass
                            if 1!=0:
                                pass
                                if 1!=0:
                                    pass   
                                    context.DataName =\
                                            str('日期'),\
                                            str('时间'),\
                                            str('总盈亏'),\
                                            str('浮动盈亏'),\
                                            str('平仓盈亏'),\
                                            str('手续费'),\
                                            str('可用资金'),\
                                            str('占用保证金'),\
                                            str('动态权益'),\
                                            str('上次结算准备金'),\
                                            str('HIGH结算准备金'),\
                                            str('LOW结算准备金')

                                    pass
                                    context.Data = ['\n',\
                                            context.Date,\
                                            context.Time,\
                                            context.ZongYinKuiAmount,\
                                            context.NewAmountFuDongYingKui,\
                                            context.NewAmountPingCangYingKui,\
                                            context.NewAmountShouXuFei,\
                                            context.KeYongAmount,\
                                            context.BaoZhengJinAmount,\
                                            context.NewAmount,\
                                            context.OrdAmount,\
                                            context.HighAmount,\
                                            context.LowAmount,\
                                            ]
                                            
                                    context.RiQi = context.Account+'_'+str(context.Date)    #日期
                                    #print(RiQi)
                                    context.WenJianMing = 'C:\AmountToExel_'+context.RiQi+'_日曲线记录.xls'
                                    #context.WenJianMing = WenJianMing
                                    #print(str(context.Time)+':'+context.WenJianMing)         
                                    #if 1 >= int(datetime.datetime.now().strftime('%d')) >= 0: #新文件0时-5分钟创建开始写表头
                                    if 10500 >= int(context.Time) >= 10000:
                                        with open(context.WenJianMing,'w',encoding='utf-8') as f:    #使用with open()新建对象f, 'w'= 覆盖
                                            f.write(','+str(context.DataName))    #覆盖写入表头最上层
                                            pass
                                    elif 190000 > int(context.Time) > 10500:
                                        with open(context.WenJianMing,'a',encoding='utf-8') as f:    #开始添加记录表头数据 'a'=添加
                                            for index in context.Data:
                                                #print(str(i))
                                                f.write(','+str(index))    #写入数据,文件保存在上面指定的目录,加\n为了换行更方便阅读
                                        if 1!=0:
                                            pass
                                            if 1!=0:
                                                pass
                                                if 1!=0:
                                                    pass
                                                    if 1!=0:
                                                        pass
                                                        if 1!=0:
                                                            pass


##########################################################################################
#plt.ion()
#fig = plt.figure()                      # 创建一个没有 axes 的 figure
#fig.suptitle('记录绘制日内资金曲线')  # 添加标题以便我们辨别
#fig, ax_lst = plt.subplots(4,1)        # 创建一个以 axes 为单位的 2x2 网格的 figure
#plt.ioff()
#plt.show()
#plt.show(block=True)
##########################################################################################
# after_trading函数会在每天交易结束后被调用,当天只会被调用一次。 --(选择实现)
#def after_trading(context):
#    print('py_Amount_64_OK==>['+context.WenJianMing+']')
#    pass
    #context.HighAmount =[]
#    context.HighAmount = get_account(6)   
#    context.LowAmount = get_account(6)   
#    print('py_Amount/def before_trading(context):/context.HighAmount='+str(context.HighAmount)+'/context.LowAmount='+str(context.LowAmount))  
   
# order_status当委托下单,成交,撤单等与下单有关的动作时,该方法就会被调用。---(选择实现)
#def order_status(context,order):
#    pass

# order_action当查询交易接口信息时返回的通知---(选择实现)
#def order_action(context,type, account, datas)
#       pass

# exit函数会在测评结束或者停止策略运行时会被调用。---(选择实现)
def exit(context):
    write_logging('AmountToExel/def exit(context):')


补充内容 (2022-9-6 13:42):
AmountToExel
账户日内曲线记录模块,
可扩展成自动风控,分析日内曲线的状态,对总账户进行风险控制,

补充内容 (2022-9-6 13:44):
输出改为exel文件,方便做二次分析和绘制日内曲线图表,实时识别和分析统计评估判断账户交易状态,对日内总曲线进行控制和量化分析.
回复

使用道具 举报

3

主题

76

帖子

76

积分

等级: 免费版

注册:
2021-7-16
曾用名:
 楼主| 发表于 2022-9-7 14:30 | 显示全部楼层
#Py_Amount 记录绘制日内资金曲线反馈与分析
# 本Python代码主要用于策略交易
# 可以自己import我们平台支持的第三方python模块,比如pandas、numpy等。
#from PythonApi import *
import datetime     #python 原生内置日期模块
import time        #python 原生内置时间模块
import random        #python 原生内置随机模块
import math
#########################################################################################################
#  参数定义区,这里定义的参数可以直接在context对象中获取。--(选择实现)
def parameter():
    input_par("Account",257205,1,9999999999,1)
    input_par("WinLossBi",0,-100,100,1)
    input_par("StopWin",0.01,0.01,1,0.01)
    input_par("StopLoss",0.01,0.01,1,0.01)
    input_par("Repeat",0,0,1,1)
    pass
#    input_par("myvalues2",10,1,20,1)
#  在这个方法中编写任何的初始化逻辑。context对象将会在你的算法策略的任何方法之间做传递。--(必须实现)
def init(context):
    context.HighAmount = 0
    context.LowAmount = 0
    context.Account = str(context.Account)
    context.WinLossBi =(context.WinLossBi)
    context.StopWin = (context.StopWin)
    context.StopLoss = (context.StopLoss)
    context.Repeat = (context.Repeat)
    if context.WinLossBi == 0:
        context.StopWin = (context.StopWin)
        context.StopLoss = (context.StopLoss)
    if context.WinLossBi > 0:
        context.StopWin = (context.StopWin) * abs(context.WinLossBi)
        context.StopLoss = (context.StopLoss)
    if context.WinLossBi < 0:
        context.StopWin = (context.StopWin)
        context.StopLoss = (context.StopLoss) * abs(context.WinLossBi)
    context.StopLoss = -(context.StopLoss)     
    print('AmountToExel/设置交易账户:'+str(context.Account)+'/设置盈亏比:'+str(context.WinLossBi)\
            +'/品种设置止盈率/StopWin:'+str(context.StopWin)+'/品种设置止损率/StopLoss:'+str(context.StopLoss))   
    pass
# before_trading此函数会在每天基准合约的策略交易开始前被调用,当天只会被调用一次。--(选择实现)
def before_trading(context):
    context.HighAmount=0
    context.LowAmount=0
    pass
   
# 你选择的品种的数据更新将会触发此段逻辑,例如日或分钟历史数据切片或者是实时数据切片更新。--(必须实现)
def handle_bar(context):
    pass      
    if get_account(6) == 255 or get_account(26) == 255 or get_account(19) == 255:
        #write_logging('AmountToExel/账户异常!未登录!退出交易!')
        #return
        pass
    else:   
        context.S0 = 'SQAG00'
        if context.run_info.base_book_id != context.S0:
            write_logging('AmountToExel/设置基准合约为[白银连续(SQAG00)]设置无效')
            #return
            pass
        if not istradertime(context.S0):
            #write_logging('AmountToTxt/设置基准合约为[白银连续(SQAG00)]非交易时间')
            #return
            pass
        else:
            pass
            if 1!=0:
                context.Bar = context.run_info.frequency    #python 运行当前周期指向pel策略计算参数
                context.BarLen = 1
                #context.S0 = context.run_info.base_book_id
                context.NameS0 = get_dynainf(context.S0,219)    #合约池名称
                context.DataTime = (history_bars(context.S0,context.BarLen,context.Bar,'datetime',True,True)) #(history_bars(s,BarLen,Bar,'datetime',True,True))
                context.DataTime = int(context.DataTime)
                context.Year = str(context.DataTime)[0:4]
                context.Month = str(context.DataTime)[4:6]
                context.Day = str(context.DataTime)[6:8]
                context.Time = str(context.DataTime)[8:]
                context.Date = str(context.DataTime)[0:8]
                #print(context.DataTime)
                #context.Date = datetime.datetime.now().strftime('%y-%m-%d')    #时间
                #context.Time = datetime.datetime.now().strftime('%H:%M:%S')    #时间
                pass
                context.NewAmountFuDongYingKui = get_account(4)        #4 当前交易帐户中的浮动盈亏
                context.NewAmount = get_account(6)                    #6 当前交易帐户中的动态权益/资产值
                context.KeYongAmount = get_account(19)                #19 当前可用资金
                context.OrdAmount = get_account(26)                    #26 上次结算准备金/期初余额
                context.BaoZhengJinAmount = get_account(28)            #28 占用保证金/证券市值
                context.NewAmountPingCangYingKui = get_account(30)  #30 平仓盈亏数额/回报卖出金额/融券盈亏
                context.NewAmountShouXuFei = get_account(31)        #31 当前交易帐户中的手续费
                context.ZongYinKuiAmount = (context.NewAmountFuDongYingKui \
                                            + context.NewAmountPingCangYingKui \
                                            - context.NewAmountShouXuFei)    #账户总盈亏   
                pass
                if context.HighAmount < context.OrdAmount:
                    context.HighAmount = context.OrdAmount
                    pass
                if context.LowAmount > context.OrdAmount:
                    context.LowAmount = context.OrdAmount
                    pass
                if context.NewAmount > context.HighAmount:
                    context.HighAmount = context.NewAmount
                    pass
                if context.NewAmount < context.LowAmount:
                    context.LowAmount = context.NewAmount
                    pass
                pass
                if 1!=0:
                    pass
                    context.portfolio_book = {}
                    context.portfolio_book = get_portfolio_book (2,context.Account)   
                    context.DataName = {}
                    context.DataName =\
                            str('日期'),\
                            str('时间'),\
                            str('总盈亏'),\
                            str('浮动盈亏'),\
                            str('平仓盈亏'),\
                            str('手续费'),\
                            str('可用资金'),\
                            str('占用保证金'),\
                            str('动态权益'),\
                            str('上次结算准备金'),\
                            str('HIGH动态权益'),\
                            str('LOW动态权益'),\
                            str('当前账户持仓品种')
                    pass
                    context.Data = {}
                    context.Data = ['\n',\
                            context.Date,\
                            context.Time,\
                            context.ZongYinKuiAmount,\
                            context.NewAmountFuDongYingKui,\
                            context.NewAmountPingCangYingKui,\
                            context.NewAmountShouXuFei,\
                            context.KeYongAmount,\
                            context.BaoZhengJinAmount,\
                            context.NewAmount,\
                            context.OrdAmount,\
                            context.HighAmount,\
                            context.LowAmount,\
                            context.portfolio_book,\
                            ]
                    pass        
                    context.RiQi = context.Account+'_'+str(context.Date)    #日期
                    #print(RiQi)
                    context.WenJianMing = 'C:\AmountToExel_'+context.RiQi+'_日曲线记录.csv'
                    #context.WenJianMing = WenJianMing
                    #print(str(context.Time)+':'+context.WenJianMing)         
                    #if 1 >= int(datetime.datetime.now().strftime('%d')) >= 0: #新文件0时-5分钟创建开始写表头
                    if 240000 > int(context.Time) > 0:
                        try:
                            with open(context.WenJianMing,mode='r',encoding='utf-8') as f:
                                #print(f.readlines())
                                #elif 190000 >= int(context.Time) > 10500:
                                with open(context.WenJianMing,mode='a',encoding='utf-8') as f:    #开始添加记录表头数据 'a'=添加
                                    for index in context.Data:
                                        #print(str(i))
                                        f.write(','+str(index))    #写入数据,文件保存在上面指定的目录,加\n为了换行更方便阅读
                                        #print(context.WenJianMing)
                                        pass
        
                        except FileNotFoundError:
                            with open(context.WenJianMing,mode='w',encoding='utf-8') as f:    #使用with open()新建对象f, 'w'= 覆盖
                                f.write(','+str(context.DataName))    #覆盖写入表头最上层
                                print(context.WenJianMing)
                                pass

# after_trading函数会在每天交易结束后被调用,当天只会被调用一次。 --(选择实现)
#def after_trading(context):
    pass
# order_status当委托下单,成交,撤单等与下单有关的动作时,该方法就会被调用。---(选择实现)
#def order_status(context,order):
    pass

# order_action当查询交易接口信息时返回的通知---(选择实现)
#def order_action(context,type, account, datas)
    pass

# exit函数会在测评结束或者停止策略运行时会被调用。---(选择实现)
def exit(context):
    write_logging('AmountToExel/def exit(context):')
===================================
#20220908 统一模块 参数控制和标准化 精简 模块化
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 微信登录

本版积分规则

手机版|小黑屋|上海金之塔信息技术有限公司 ( 沪ICP备13035422号 )

GMT+8, 2025-6-30 01:20 , Processed in 0.150481 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表