在这里给大家一个Python期货模型参考,作为入门参考应该还可以,这个我曾经写的第一个完整的python期货交易模型源码,历史数据来源于自己的数据库,交易接口也是基于CTP的自己的交易接口。

相当一部分函数是基于其他的python自定义类,太多了放不下,只放策略主题部分作为参考,高手们请忽略!

import math, sys, os, NMath

import NLog as lg

import NDateTime as dt

import Future as ft

import TradeQuery as tq

import time

# import numpy as np

_investorid = '106474'

_instrument = 'rb1805'

#模型名称,默认为文件名称

_s_model_name = 'Python:%s' % os.path.basename(sys.argv[0])[:os.path.basename(sys.argv[0]).find(".")]

#模型参数

param_ma = 20

param_loss = 30

param_hl = 10

#信号记录

_signals = []

_math = NMath.NMath()

sf = ft.SingleFutureFast()

_dc_orginal_data = sf._get_data('rb', sort = 'asc')#, startdate='20160101', enddate = '20171231', cycle='d1', ideliverydate='1801')

if _dc_orginal_data == None:

print('获取数据错误:要获取的合约数据量为0!')

j = param_ma

while j < (len(_dc_orginal_data['index'])):

#动态止损SP;

if len(_signals) > 0 and (_signals[-1].sig == 'BK' or _signals[-1].sig == 'BPK') and _signals[-1].index < j:

if _signals[-1].price - _dc_orginal_data['dMinPrice'][j] > param_loss:

_signals = ft.FilterAddWH(_signals, ft.whSignal(_dc_orginal_data['iReceiveDate'][j], 'SP', _dc_orginal_data['dClosePrice'][j], _dc_orginal_data['index'][j]))

if _signals[-1].index < j:

max1 = _math.max_series(_dc_orginal_data['dClosePrice'][_signals[-1].index : j])

max2 = _math.max_series(_dc_orginal_data['dOpenPrice'][_signals[-1].index : j])

max3 = _math.Nmax(max1, max2)

if max3 - _signals[-1].price >= 50 and max3 - _signals[-1].price < 100 and max3 - _dc_orginal_data['dClosePrice'][j] > 40:

_signals = ft.FilterAddWH(_signals, ft.whSignal(_dc_orginal_data['iReceiveDate'][j], 'SP', _dc_orginal_data['dClosePrice'][j], _dc_orginal_data['index'][j]))

if max3 - _signals[-1].price >= 100 and max3 - _signals[-1].price < 200 and max3 - _dc_orginal_data['dClosePrice'][j] > 80:

_signals = ft.FilterAddWH(_signals, ft.whSignal(_dc_orginal_data['iReceiveDate'][j], 'SP', _dc_orginal_data['dClosePrice'][j], _dc_orginal_data['index'][j]))

if max3 - _signals[-1].price >= 200 and max3 - _signals[-1].price < 400 and max3 - _dc_orginal_data['dClosePrice'][j] > 120:

_signals = ft.FilterAddWH(_signals, ft.whSignal(_dc_orginal_data['iReceiveDate'][j], 'SP', _dc_orginal_data['dClosePrice'][j], _dc_orginal_data['index'][j]))

if max3 - _signals[-1].price >= 400 and max3 - _dc_orginal_data['dClosePrice'][j] > 200:

_signals = ft.FilterAddWH(_signals, ft.whSignal(_dc_orginal_data['iReceiveDate'][j], 'SP', _dc_orginal_data['dClosePrice'][j], _dc_orginal_data['index'][j]))

# 动态止损BP

if len(_signals) > 0 and (_signals[-1].sig == 'SK' or _signals[-1].sig == 'SPK') and _signals[-1].index < j:

if _dc_orginal_data['dMaxPrice'][j] - _signals[-1].price > param_loss:

_signals = ft.FilterAddWH(_signals, ft.whSignal(_dc_orginal_data['iReceiveDate'][j], 'BP', _dc_orginal_data['dClosePrice'][j], _dc_orginal_data['index'][j]))

if _signals[-1].index < j:

min1 = _math.min_series(_dc_orginal_data['dClosePrice'][_signals[-1].index : j])

min2 = _math.min_series(_dc_orginal_data['dOpenPrice'][_signals[-1].index : j])

min3 = _math.Nmin(max1, max2)

if _signals[-1].price - min3 >= 50 and _signals[-1].price - min3 < 100 and _dc_orginal_data['dClosePrice'][j] - min3 > 40:

_signals = ft.FilterAddWH(_signals, ft.whSignal(_dc_orginal_data['iReceiveDate'][j], 'BP', _dc_orginal_data['dClosePrice'][j], _dc_orginal_data['index'][j]))

if _signals[-1].price - min3 >= 100 and _signals[-1].price - min3 < 200 and _dc_orginal_data['dClosePrice'][j] - min3 > 80:

_signals = ft.FilterAddWH(_signals, ft.whSignal(_dc_orginal_data['iReceiveDate'][j], 'BP', _dc_orginal_data['dClosePrice'][j], _dc_orginal_data['index'][j]))

if _signals[-1].price - min3 >= 200 and _signals[-1].price - min3 < 400 and _dc_orginal_data['dClosePrice'][j] - min3 > 120:

_signals = ft.FilterAddWH(_signals, ft.whSignal(_dc_orginal_data['iReceiveDate'][j], 'BP', _dc_orginal_data['dClosePrice'][j], _dc_orginal_data['index'][j]))

if _signals[-1].price - min3 >= 400 and _dc_orginal_data['dClosePrice'][j] - min3 > 200:

_signals = ft.FilterAddWH(_signals, ft.whSignal(_dc_orginal_data['iReceiveDate'][j], 'BP', _dc_orginal_data['dClosePrice'][j], _dc_orginal_data['index'][j]))

mh = _math.ma_series(_dc_orginal_data['dMaxPrice'][j - param_ma : j - 1])

ml = _math.ma_series(_dc_orginal_data['dMinPrice'][j - param_ma : j - 1])

mc = _math.ma_series(_dc_orginal_data['dClosePrice'][j - param_ma : j - 1])

mo = _math.ma_series(_dc_orginal_data['dOpenPrice'][j - param_ma : j - 1])

mc = (mh + ml + mc + mo) / 4

if _dc_orginal_data['dMinPrice'][j] > mc and _dc_orginal_data['dOpenPrice'][j] < _dc_orginal_data['dClosePrice'][j]:

_signals = ft.FilterAddWH(_signals, ft.whSignal(_dc_orginal_data['iReceiveDate'][j], 'BP', _dc_orginal_data['dClosePrice'][j], _dc_orginal_data['index'][j]))

if _dc_orginal_data['dMaxPrice'][j] < mc and _dc_orginal_data['dOpenPrice'][j] > _dc_orginal_data['dClosePrice'][j]:

_signals = ft.FilterAddWH(_signals, ft.whSignal(_dc_orginal_data['iReceiveDate'][j], 'SP', _dc_orginal_data['dClosePrice'][j], _dc_orginal_data['index'][j]))

min1 = _math.min_series(_dc_orginal_data['dClosePrice'][j - param_hl : j - 1])

min2 = _math.min_series(_dc_orginal_data['dOpenPrice'][j - param_hl : j - 1])

min3 = _math.Nmin(min1, min2)

max1 = _math.max_series(_dc_orginal_data['dClosePrice'][j - param_hl : j - 1])

max2 = _math.max_series(_dc_orginal_data['dOpenPrice'][j - param_hl : j - 1])

max3 = _math.Nmax(max1, max2)

if _dc_orginal_data['dClosePrice'][j] > mh and _dc_orginal_data['dMaxPrice'][j] > max3 and _dc_orginal_data['dClosePrice'][j] > _dc_orginal_data['dOpenPrice'][j]:

_signals = ft.FilterAddWH(_signals, ft.whSignal(_dc_orginal_data['iReceiveDate'][j], 'BPK', _dc_orginal_data['dClosePrice'][j], _dc_orginal_data['index'][j]))

if _dc_orginal_data['dClosePrice'][j] < ml and _dc_orginal_data['dMinPrice'][j] < min3 and _dc_orginal_data['dClosePrice'][j] < _dc_orginal_data['dOpenPrice'][j]:

_signals = ft.FilterAddWH(_signals, ft.whSignal(_dc_orginal_data['iReceiveDate'][j], 'SPK', _dc_orginal_data['dClosePrice'][j], _dc_orginal_data['index'][j]))

j += 1

k = 0

for _s in _signals:

print(_s.date, _s.sig, _s.price, _s.index)

k += 1

print('总盈利:', ft.Signals_SUM(_signals))

#当日交易

_tq = tq.TradeQuery()

cur_date = dt.get_now_date_int()

_s_log = '_signals[-1].date=%s,_signals[-1].sig=%s,cur_date=%s' % (_signals[-1].date, _signals[-1].sig, cur_date)

lg.NFileLog(_s_log)

if int(_signals[-1].date) == int(cur_date):

if _signals[-1].sig =='BP':

lg.NFileLog('进入BP信号处理')

_list = _tq.QuerySignals(_s_model_name, 'BUY', 'CLOSE', ft.OpenVolume)

time.sleep(1)

if len(_list) == 0 or _list[7] < cur_date:

ft.ExecwhSignal(_signals[-1], _s_model_name, _investorid, _instrument)

if _signals[-1].sig =='BK':

lg.NFileLog('进入BK信号处理')

_list = _tq.QuerySignals(_s_model_name, 'BUY', 'OPEN', ft.OpenVolume)

time.sleep(1)

if len(_list) == 0 or _list[7] < cur_date:

ft.ExecwhSignal(_signals[-1], _s_model_name, _investorid, _instrument)

if _signals[-1].sig =='SP':

lg.NFileLog('进入SP信号处理')

_list = _tq.QuerySignals(_s_model_name, 'SELL', 'CLOSE', ft.OpenVolume)

time.sleep(1)

if len(_list) == 0 or _list[7] < cur_date:

ft.ExecwhSignal(_signals[-1], _s_model_name, _investorid, _instrument)

if _signals[-1].sig =='SK':

lg.NFileLog('进入SK信号处理')

_list = _tq.QuerySignals(_s_model_name, 'SELL', 'OPEN', ft.OpenVolume)

time.sleep(1)

if len(_list) == 0 or _list[7] < cur_date:

ft.ExecwhSignal(_signals[-1], _s_model_name, _investorid, _instrument)

if _signals[-1].sig =='BPK':

lg.NFileLog('进入BPK信号处理')

_list = _tq.QuerySignals(_s_model_name, 'BUY', 'OPEN', ft.OpenVolume)

time.sleep(1)

if len(_list) == 0 or _list[7] < cur_date:

ft.ExecwhSignal(_signals[-1], _s_model_name, _investorid, _instrument)

if _signals[-1].sig =='SPK':

lg.NFileLog('进入SPK信号处理')

_list = _tq.QuerySignals(_s_model_name, 'SELL', 'OPEN', ft.OpenVolume)

time.sleep(1)

if len(_list) == 0 or _list[7] < cur_date:

ft.ExecwhSignal(_signals[-1], _s_model_name, _investorid, _instrument)

python 期货程序化_期货程序化交易相关推荐

  1. python 期货交易接口_期货数据接口(期货数据接口 python)

    期货数据接口,聚宽,恒生聚宽,菜狗均可以接口聚宽ip列表小收费:聚宽聚宽-trader.com恒生聚宽ip列表,nae 我们公司用股票接口,你可以试一下websocket.high.js这个 聚宽和华 ...

  2. 股票自动交易python下单接口_股票自动交易Python下单接口

    股票自动交易软件助手的 Order.dll 自动下单接口不仅仅能在大智慧,通达信,飞狐等软件公式里调用,也可以在windows程序里直接调用,支持 Python, C/C++/C#接口调用.有编程能力 ...

  3. 期货CTP接口与程序化(量化交易)的对接(2)——基本概念

    上一讲:期货CTP接口与程序化(量化交易)的对接(1) 先理清几个概念. 策略 这是交易思路. 举一个简单的例子.下文都用这个例子来说明问题. 假如我给自己规定:"每当出现长阳,我就买进,每 ...

  4. 如何用Python下载并分析期货持仓数据

    期货持仓报告 期货持仓报告,简称COT(Commitment of Traders)报告,记录机构投资者包括商业公司和对冲基金的期货持仓数据.由美国期货交易委员会(CFTC)公布,公布时间是每周五下午 ...

  5. 程序化交易系统主观辅助交易策略编写和演示 及文华tb单个品种指数合成方法

    程序化交易系统主观辅助交易策略编写和演示 def tick_zhishu(ls):"""从数据库中读取合约后,合成约指数最新价,用于合成指数合约k线,采用持仓量加权:pa ...

  6. 恒指期货的特性及相应交易技巧

    恒生指数是众多日内交易者喜欢的投资品种,越来越多的人从认识,接纳到追捧,确立了恒生指数"亚洲指数之王"的权威性与广泛性.然而,由于缺乏对恒指期货特性的深入了解,很多人盲目操作,导致 ...

  7. 用Python下载并分析期货持仓数据

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 以下文章来源于Trochil蜂鸟数据 ,作者蜂鸟数据Trochil 期货持仓报告 ...

  8. 量化交易python入门书籍推荐_求量化投资入门书籍或课程推介。?

    入门,还是要看一个人的知识背景. 1.有一本:西蒙斯打开量化投资的黑箱,还有西蒙斯的文艺复兴公司的介绍(喜马拉雅),另外B站有西门斯的演讲. 通过对西蒙斯的了解,你要对自己的知识结构.背景.资源和量化 ...

  9. Python 实战之 什么是量化交易?它与python之间的关系

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 本文章来自腾讯云 作者:somenzz 想要学习Python?有问题得不到第一时间 ...

最新文章

  1. JAVA EE 中之AJAX 无刷新地区下拉列表三级联动
  2. TF之LSTM:利用基于顺序的LSTM回归算法对DIY数据集sin曲线(蓝虚)预测cos(红实)(matplotlib动态演示)
  3. Road Construction
  4. Docker与CI持续集成/CD(转)
  5. python重定向到socket_python套接字流重定向实例汇总
  6. 31省份开学时间一览表
  7. cordova混合开发流程
  8. Github使用之git回退到某个历史版本
  9. VLFeat在matlab中的使用
  10. win11系统正式版介绍
  11. spark-sql配置并优化
  12. 新库上线 | CnOpenData中国环境统计年鉴数据
  13. matlab对比度拉伸代码,图像增强常用代码
  14. 搭建开源物联网平台教程
  15. 推动服务网格社区前进
  16. 快播将关闭QVOD服务器 清理低俗和盗版内容
  17. 《Blender图解教程:新手入门练习》
  18. Android java.lang.IllegalStateException: Underflow in restore - more restores than saves
  19. 如何反汇编exe之VB程序
  20. caffe 提取LMDB时可能出现的错误

热门文章

  1. 【无敌海景清醒电脑xp主题】
  2. 给家里老台式机装ubuntu15.10的一点杂记
  3. live555 source
  4. DateTime 格式字符串
  5. 相约云台山,露营party嗨起来
  6. 关于 major.minor version 那些事
  7. 赛马网基本算法之--分苹果
  8. css属性小结之文本
  9. 儿知错父之过下一句_“子不孝父之过”下一句是什么?
  10. Blender渲染分辨率如何优化设置?这些渲染技巧你要知道