Python_9.9_量化交易_main详解(一)

  • if __name__ == '__main__':
  • 1-11
  • 12-37
  • 38-49
  • 交易时间图


roots = '.\wwb_ComLog' + '\\' # 根文件
    nowday = time.strftime('%Y%m%d', time.localtime()) # 当前日期,
    GoodTick, Goodminslen, GoodHands, FinCont, BondCont, SunCont, MoonCont, BasicCont, TodayFixCont = ContInfo()
    print(TodayFixCont)
    tradingdays = pd.read_csv(roots + 'tradingdays.csv', index_col=0)
    tdays = list(set(eval(tradingdays['tradingdays']['days'])))
    tdays.sort(reverse=False)  # 升序
    print(tdays[-5:])
    currenttime = int(time.strftime('%H%M%S', time.localtime()))  # 当前时间 判断是夜盘交易还是白天交易 决定Finaltime
    everydaylist = [x.strftime('%Y%m%d') for x in list(pd.date_range(start='20200101', end='20250101'))]
    everydaylist.sort() # 返回日历日序列
    if currenttime > 30000 and currenttime < 152000:# 白天交易
        cover = BasicCont  # 白天连续交易的商品期货集合,所有商品期货
        startstamp = int(nowday + '090002')  # 商品期货开盘时间
        finaltime = int(time.mktime(time.strptime(str(nowday) + '-152000', "%Y%m%d-%H%M%S")))  # 当天下午3.20,程序退出交易
        preKtime = '090000' # 各个分钟线已经到的日期, 早上开盘时, 设定为当前K线已经到9点
        nowloc = everydaylist.index(nowday)# 日历日序列中今天(当前交易日)所在的位置
        lastloc = everydaylist.index(tdays[-1]) # 日历日序列中上一个交易日所在的位置
        if nowloc - lastloc == 1: # 相邻 连续交易日
            OVER_16_DAY = int(everydaylist[lastloc])
            LESS_3_DAY = int(everydaylist[nowloc])
            LESS_16_OVER_8_Day = int(everydaylist[nowloc])
        else: # 跨周末, 跨节假日交易日
            OVER_16_DAY = int(everydaylist[lastloc])
            LESS_3_DAY = int(everydaylist[lastloc+1])
            LESS_16_OVER_8_Day = int(everydaylist[nowloc])
        daylist = tdays[-3:] + ['9999', ] # 需要读入本地分钟k线的过去交易日, 不包括今天, 9999表示昨天夜盘21点到今天早晨的分钟数据
    else:
        cover = MoonCont  # 夜晚连续交易的商品期货集合
        startstamp = int(nowday + '205999')  # 商品期货开盘时间
        nextday = time.strftime('%Y%m%d', time.localtime(time.time() + 24 * 3600)) # 日历上的下一天
        finaltime = int(time.mktime(time.strptime(str(nextday) + '-024000', "%Y%m%d-%H%M%S")))  # 第二天早晨2.40 程序退出
        preKtime = '210000'# 各个分钟线已经到的日期, 晚上开盘时, 设定为当前K线已经到21点
        OVER_16_DAY = int(time.strftime('%Y%m%d', time.localtime())) # actionday
        LESS_3_DAY = int(time.strftime('%Y%m%d', time.localtime(time.mktime(time.localtime()) + 24 * 3600))) # 夜盘连接第二天
        LESS_16_OVER_8_Day = OVER_16_DAY # 夜盘开始前有今天下午最后一个tick
        daylist = tdays[-3:]  # 过去交易日, 包括今天
    print([OVER_16_DAY,LESS_3_DAY,LESS_16_OVER_8_Day] )
    print(daylist)
    dailyaction = pd.DataFrame(columns=['date', 'time', 'cont', 'hands', 'target', 'order'])
    Half = 0.5 # 用于逻辑判断
    Great = 100000000
    pathsaved = roots + nowday  # 保存问键路径
    fileExist = os.path.exists(pathsaved)
    if not fileExist:
        os.makedirs(pathsaved)  # 如果不存在则创建目录
    pathsaved = pathsaved + '\\'
    ParaCom = pd.read_csv(roots + 'ParaCom.csv', index_col='unique') # 策略参数
    print(ParaCom)

if name == ‘main’:

从最下面的主函数倒推

1-11

1.一个赋值,第4行被引用
商品期货和股指期货交易时间的不同,程序主要完成 商品期货 自动化交易
Note:保持计算机的时间与准确时间误差不超过2分钟
roots = '.\wwb_ComLog' + '\\'

2.赋值,第13-38行被引用
nowday = time.strftime('%Y%m%d', time.localtime()) # 当前日期,

3.利用一个ConInfo()函数,进行多个变量的同时初始化,里面是一一对应的。
返回商品期货信息, 包括tick大小,交易限定手数等,参考ContInfo
GoodTick, Goodminslen, GoodHands, FinCont, BondCont, SunCont, MoonCont, BasicCont, TodayFixCont = ContInfo()

4.print(TodayFixCont)
打印今日锁仓的合约,小写
print(TodayFixCont) 它的初始化是第3行的ContInfo()里给出的,ContInfo()里的代码是:
todayfixcont = ['if', 'ic', 'ih', 'ap', 'ma', 'j', 'jm']

然后在第3行赋值给了这个要打印的。

5.tradingdays = pd.read_csv(roots + 'tradingdays.csv', index_col=0) 用到了第一行的赋值,读取了一个csv的文件,index_col=0——第一为index值。
index_col这个详解可以参考链接 获取截止到上一个交易日的所有交易日

6.tdays = list(set(eval(tradingdays['tradingdays']['days']))) eval是等式,set是拆解为单字的集合,去重。
taadingdays是只有一个列,列名叫tradingdays,只有一个行,是days,存放了所有的日期

能否用Python实现外汇国际黄金国际原油的自动化交易 python量化外汇交易_当前日期

7.tdays.sort(reverse=False) # 升序

8.print(tdays[-5:])

9.currenttime = int(time.strftime('%H%M%S', time.localtime())) 时分秒,字符串转化为整型
time strftime() 接收时间元组,返回表示时间的字符串。
当前时间 判断是夜盘交易还是白天交易 决定Finaltime

10.everydaylist = [x.strftime('%Y%m%d') for x in list(pd.date_range(start='20200101', end='20250101'))] 盲猜这个代码能用五年

11.everydaylist.sort() # 返回日历日序列

12-37

12.if currenttime > 30000 and currenttime < 152000:

第10行的currenttime,3:00:00以后,15:20:00以前

这里构建 OVER_16_DAY LESS_3_DAY LESS_16_OVER_8_Day三个变量是CTP推送的实际交易日有不准确,需要调整

而调整主要针对不同推送的time字段的不同进行调整 具体可以参看 seekdata 和 OnNewTick函数

13.cover = BasicCont

cover、BasicCont是第3行利用那个continfo()赋值的,continfo里的BasicCont值是

basiccont = [‘au’, ‘ag’,
‘cu’, ‘al’, ‘zn’, ‘pb’, ‘ni’, ‘sn’,
‘jm’, ‘j’, ‘rb’, ‘i’, ‘hc’, ‘ss’, ‘wr’, ‘sm’, ‘sf’,
‘fg’, ‘v’, ‘fb’, ‘bb’,
‘sc’, ‘zc’, ‘fu’, ‘pg’, # 暂时删除LU
‘bu’, ‘ru’, ‘sp’, ‘nr’, ‘l’, ‘ta’, ‘eg’,
‘ma’, ‘pp’, ‘eb’, ‘ur’, ‘sa’,
‘c’, ‘wh’, ‘pm’, ‘rr’, ‘ri’, ‘jr’, ‘lr’,
‘a’, ‘b’, ‘m’, ‘y’, ‘rs’, ‘rm’, ‘oi’, ‘p’,
‘cf’, ‘sr’, ‘cy’,
‘jd’, ‘ap’, ‘cj’, ‘cs’] # 所有商品

14.startstamp = int(nowday + '090002')

nowday是第2行赋值的当前日期,年月日。年月日字符串加时分秒9:00:02

15.finaltime = int(time.mktime(time.strptime(str(nowday) + '-152000', "%Y%m%d-%H%M%S")))

str() 函数将对象转化为适于人阅读的形式。

time strptime()把时间字符串,解析成一个时间元组。-152000不是负数的意思,是对应后面的格式

time.mktime() 接收struct_time对象作为参数,返回用秒数来表示时间的浮点数。

这个交易时间是尽量把交易最晚的时间都算进去,时间表在最后

16.preKtime = '090000'

17.nowloc = everydaylist.index(nowday)

everydaylist是11-12行自己排列的5年的日序列。

18.lastloc = everydaylist.index(tdays[-1])

tdays是个序列,-1是指tdays里排序最大的交易日。

19.if nowloc - lastloc == 1:

上个交易日正好是昨天。

20.OVER_16_DAY = int(everydaylist[lastloc])

这个lastloc是nowday这个日子在整个五年日期列表里的顺序序号

这个操作就是把序号还原成了整型日期

21.LESS_3_DAY = int(everydaylist[nowloc])

22.LESS_16_OVER_8_Day = int(everydaylist[nowloc])

23.else:

24.OVER_16_DAY = int(everydaylist[lastloc])

25.LESS_3_DAY = int(everydaylist[lastloc+1])

上个交易日的下一天,这个是由于周五晚上黄金会交易到周六的2点左右

26.LESS_16_OVER_8_Day = int(everydaylist[nowloc])

27.daylist = tdays[-3:] + ['9999', ]

两个list相加,逗号表示的是一个list,不然语法报错

28.else:

29.cover = MoonCont

30.startstamp = int(nowday + '205999')

把日期加上时间,年月日时分秒

31.nextday = time.strftime('%Y%m%d', time.localtime(time.time() + 24 * 3600))

32.finaltime = int(time.mktime(time.strptime(str(nextday) + '-024000', "%Y%m%d-%H%M%S")))

02:40:00程序退出,也是为了包括最上面的时间。

33.preKtime = '210000'

夜晚交易时K线的开盘时间

34.OVER_16_DAY = int(time.strftime('%Y%m%d', time.localtime()))

35.LESS_3_DAY = int(time.strftime('%Y%m%d', time.localtime(time.mktime(time.localtime()) + 24 * 3600)))

36.LESS_16_OVER_8_Day = OVER_16_DAY

37.daylist = tdays[-3:]

38-49

38.print([OVER_16_DAY,LESS_3_DAY,LESS_16_OVER_8_Day] )

39.print(daylist)

41.dailyaction = pd.DataFrame(columns=['date', 'time', 'cont', 'hands', 'target', 'order'])

一个赋值,没看到用处,暂放

42.Half = 0.5

43.Great = 100000000

44.pathsaved = roots + nowday

看不懂为什么要这样加?

roots = ‘.\wwb_ComLog’ + ‘\’ # 根文件
nowday = time.strftime(’%Y%m%d’, time.localtime()) # 当前日期,

45.fileExist = os.path.exists(pathsaved)

46.if not fileExist:

47.os.makedirs(pathsaved)

48.pathsaved = pathsaved + '\\'

49.ParaCom = pd.read_csv(roots + 'ParaCom.csv', index_col='unique') # 策略参数

index_col='unique’这个操作很迷,没查到hhh

50.print(ParaCom)

交易时间图

能否用Python实现外汇国际黄金国际原油的自动化交易 python量化外汇交易_当前日期_02