在这里给大家一个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. Maya创建科幻3D动画循环场景视频教程
  2. 根据CPU核数合理设置线程池大小
  3. POJ2669不错的最大流 竞赛问题(枚举King的个数)
  4. BugkuCTF-Misc:想蹭网先解开密码
  5. 歌谣对自己的“自勉“
  6. Android 亮屏速度分析
  7. BlazeDS入门教程-很详细-赞原创作者一个
  8. 管理mysql表知识点,数据库知识点整理(全)
  9. php钱汇算成美元,PHP to USD
  10. html隐藏不占位置,css中隐藏不占空间怎么设置?
  11. THINKPHP6 运行出现Malformed UTF-8 characters, possibly incorrectly encoded
  12. 微信小游戏制作坦克大战(六)碰撞检测,主角坦克碰到敌方坦克、炮弹爆炸
  13. 在Layui框架里设计一个评论列表的前端界面
  14. 基于STM32的游戏平台,其二TETRIS
  15. 推特精准客户开发手册
  16. 《超越LOGO设计:国际顶级平面设计师的成功法则(第2版)》—第1章无处不在的LOGO...
  17. 【信号与系统】(一 )信号与系统概述——信号的基本概念与分类
  18. 注释转换,较详细。新手上路,请多关照
  19. c语言编写u盘杀毒软件,一个简单的C++编写的u盘病毒代码
  20. java adt用vbox_JavaFX:动态添加的VBox没有显示出来

热门文章

  1. 如何将域名解析到服务器上去
  2. jquery 实现下拉菜单
  3. python实现最简单循环神经网络(RNNs)
  4. Java的jmap命令使用详解
  5. Eclipse开发调试RMI指南
  6. 分享几个冷门软件,但很好用
  7. 【量子计算】量子隐形传态的实现
  8. x86架构ubuntu18下运行GBA模拟器mgba
  9. 将html元素转成图片
  10. Spark高手之路1—Spark简介