盘口策略 | 交易中最重要的是什么?

news2024/12/26 23:40:03

 量化策略开发,高质量社群,交易思路分享等相关内容

『正文』

ˇ

交易中最重要的是什么?

当然是Timing啊~~~

“时机是这个世界上最难得到,又最容易失去的东西”夫难得而易失者,时也;时至而不旋踵者,机也,故圣人常顺时而动,智者必因机而发.原文出自《九州春秋》        

被套不是最难受的,难受的是你止损后行情来了,就差一点你就见到黎明的太阳了。这叫什么?Timing啊~~~

A大架狙一分钟没人来,刚切道具人就拉出来把你秒了,这叫什么?Timing啊~~~

桓温枋头撤军,以精兵叠后,谨慎小心了一路,马上就要回到东晋了松懈了,被慕容垂8000精骑兵突袭死伤过半。这叫什么?Timing啊~~~

人生有太多timing时刻,不是你抓别人的,就是别人抓你的。这个市场何尝不是,我也想抓抓市场的timing,不知可否。

言归正传,我们想抓市场的机会需要有具体的方法和既定规则,我们是做量化的所以每一步都要能说明清楚。

几年前接触到订单流觉得很有意思,它是从微观角度来描述这个市场的,使用最小颗粒的数据计算出主动买卖的指标,找到价格的支撑,阻力,哪个K线主动买入多,哪个是主动卖出多,整个市场主动买卖力量是如何分布的等等之类,它最吸引我的地方是可以用数量描述清楚市场的多空力量。这一点儿对于做量化策略非常关键,可以编写一个完整的交易条件,而不是像某些主观理论存在模棱两可的地方。《订单流图表与普通K线的不同》

订单流不会错吗?错,会经常错。不怕它错,有对应的止损止盈,做的是一个盈亏比。

(图表来源:松鼠沙盘)

(图表来源:松鼠沙盘)

图中的红绿横线就是由多个失衡造成的堆积,分为多头堆积和空头堆积。也就是在某一个K线上出现了供需矛盾极大的情况,有一方占有绝对优势,

这是一个交易的信号。当出现信号时,可以尝试把握这种机会。止损设置在信号K线的最低价或者空头的最高价。以小的试错成本等待一个较大盈亏比的机会。也就是说你要抓主力的timing~哈哈

策略逻辑

1.开仓条件:多头堆积次数大于X做多,空头堆积次数大于X做空.互为正反手。

2.固定止损:以开仓价格的百分比计算止损价。

3.跟踪止盈:以吊灯方法跟踪价格计算出场线。

策略逻辑非常简单,没有那么多弯弯绕。这也是我非常喜欢它的地方,不用动脑子。订单流策略不同于传统技术指标策略,它无法预测信号。如果是MACD或者KDJ,你甚至可以预判到是否会交叉,但是订单流不行。它是基于最小颗粒度计算的主动买卖力量,只能等到它出现你才知道。

策略模块

1.通过tick(或逐笔)数据计算of数据

2.基于of数据计算堆积信号或其他指标

3.合成堆积信号为bar数据进行回测

4.基于CTP实时生成OF数据及信号(实盘版)

盘口策略我们分为俩个版本:回测版实盘版,今天讲的是回测版本,俱乐部里拿到源码后,群友一定会问很多的问题,策略代码实现较为复杂。我们先消化了回测版,然后7月初发布CTP实盘版。

tick生成of数据:

def orderflow_df_new(df_tick,df_min):    df_of=pd.DataFrame({})    t1 = time.time()    startArray = pd.to_datetime(df_min['starttime']).values    voluememin= df_min['volume'].values    highs=df_min['high'].values    lows=df_min['low'].values    opens=df_min['open'].values    closes=df_min['close'].values    endArray = pd.to_datetime(df_min['datetime']).values    tTickArray = pd.to_datetime(df_tick['datetime']).values    bp1TickArray = df_tick['bid_p'].values    ap1TickArray = df_tick['ask_p'].values    lastTickArray = df_tick['lastprice'].values    volumeTickArray = df_tick['volume'].values    symbolarray = df_tick['symbol'].values    indexFinal = 0    for index,tEnd in enumerate(endArray):        start = startArray[index]        bidDict = {}        askDict = {}         bar_vol=voluememin[index]        bar_close=closes[index]        bar_open=opens[index]        bar_low=lows[index]        bar_high=highs[index]        bar_symbol=symbolarray[index]        dt=endArray[index]        for indexTick in range(indexFinal,len(df_tick)):            #.........................        bidDictResult,askDictResult = process(bidDict,askDict)        bidDictResult=dict(sorted(bidDictResult.items(),key=operator.itemgetter(0)))        askDictResult=dict(sorted(askDictResult.items(),key=operator.itemgetter(0)))        prinslist=list(bidDictResult.keys())        asklist=list(askDictResult.values())        bidlist=list(bidDictResult.values())        delta=(sum(askDictResult.values()) - sum(bidDictResult.values()))        df=pd.DataFrame({'price':pd.Series([prinslist]),'Ask':pd.Series([asklist]),'Bid':pd.Series([bidlist])})        df['symbol']=bar_symbol        df['datetime']=dt        df['delta']=str(delta)        df['close']=bar_close        df['open']=bar_open        df['high']=bar_high        df['low']=bar_low        df['volume']=bar_vol        df['ticktime']=tTickArray[indexTick]        df['dj']=GetOrderFlow_dj(df)        print(df)        df_of = pd.concat([df_of, df], ignore_index=True)    print(time.time() - t1)    return df_of

计算好订单流数据后,输出是这样:

price,Ask,Bid这三列就是订单流K线里的核心数据,入下图:

有了这个脚本,你就可以源源不断的生成orderflow数据用于研究。然后我们在计算每个K线的失衡,堆积。我们的交易条件是基于堆积的,因此我们只要算出堆积列就可以实现Bar级别回测了。如下图:

sig列就是这个bar的堆积次数,正数是多头堆积,负数是空头堆积。

计算堆积的代码:

            order= {                                    "Price":price_s[i],                 "Ask":{ "Value":Bid_s[i]},                "Bid":{ "Value":Ask_s[i]}            }                             if i>=1 and i<len(price_s)-1:                if (order["Ask"]["Value"]>Ask_s[i+1]*int(Config['Value1'])):                    order["Ask"]["Color"]=itemAskBG[1]                    gxx+=1                    gj+=1                    if gj>=int(Config['Value2']) and Config['Value4']==True:                        duiji['price']=price_s[i]                        duiji['time']=dtime                        duiji['longshort']=-1                        duiji['cout']=gj                        duiji['color']='rgba(0,139,0,0.45)'#绿色                        if float(duiji['price'])>0:                            djcout+=1                else :                    gj=0                if (order["Bid"]["Value"]>Bid_s[i-1]*int(Config['Value1'])):                    xq+=1                    xxx+=1                    order["Bid"]["Color"]=itemBidBG[1]                     if xq>=int(Config['Value2']) and Config['Value4']==True:                        duiji['price']=price_s[i]                        duiji['time']=dtime                        duiji['longshort']=1                        duiji['cout']=xq                        duiji['color']='rgba(255,0,0,0.45)' #红色                        if float(duiji['price'])>0:                            djcout+=-1                else :                    xq=0

为什么要用Bar级别去回测订单流策略?

我们之前开发过很多orderflow策略脚本,详情可以查看orderflow系列。都是逐Tick回测,说实话太慢了,6个月的逐tick回测要好几个小时,这么慢的速度很难做研究,如果你的机器内存小,还有中途崩溃的问题。于是我们改变思路,在数据生成时讲信号计算好,我们只要回测含有信号的Bar就可以了。数据生成+回测用时有了质的飞跃,不到2分钟就可以完成这些工作,如下图:

用时78秒生成了orderflow数据+信号。

然后我们在用10秒回测一下:

回测已经调整好了手续费和滑点,具体品种要针对设置,这也是BackTrader麻烦的地方。为了避免偷价,我们用上一个Bar固定的信号判断,用本根bar的开盘价进行交易。这个回测是沪镍1分钟,回测的时间是2023年1月-6月。

条件设置是:堆积大于5次,正反手,固定止损0.005,固定止盈0.01

还有螺纹5M:

条件设置是:堆积大于0次,正反手,固定止损0.005,固定止盈0.01

关于收益率为什么这么少,因为我下单是1手,初始资金设置的是100W。

我回测了不同品种在同周期参数下的情况,数据较多我就不一一发了,我传到俱乐部后台了,可以下载慢慢看。

另外,要着重说一下,我目前回测没有参数寻优,这种策略逻辑非常特别,不能硬套CTA逻辑。需要针对具体的品种设置参数,如下图:

这是镍的1分钟。

这是螺纹1分钟的信号图,为什么信号数量差距这么大?因为每个品种的盘口特征,活跃度有本质的区别。要对症下药,别动不动就一个套参数打天下,一招鲜吃遍天,你以为是青霉素还是板蓝根?

生成订单流的脚本是基于国内商品的,也可以生成股票,BTC,外盘等标的数据,反正脚本是通用的,关于用什么数据没有要求,只要表头修改好就行。

我们盘口策略会在7月实盘测试,其实群里早就有朋友开始手动操作了,只是今天我们把它做成了全自动。订单流的方方面面还有很大的研究空间,我们提供了最素的版本,大家拿到源码后可以自己玩耍,比传统CTA策略更有意思。

OK,如何使用及完整代码我会录制视频讲解,大家拿到源码后可以在群里发问,想必会有很多问题,我在俱乐部群里等大家。

最后问一句:

你知木知咩叫timing啊?

本策略仅作学习交流使用,实盘交易盈亏投资者个人负责。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/713457.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

浅谈Java8中map的新方法

Map在java8中新增了两个replace的方法 1.replace(k,v) 在指定的键已经存在并且有与之相关的映射值时才会将指定的键映射到指定的值&#xff08;新值&#xff09; 在指定的键不存在时&#xff0c;方法会return回来一个null javadoc的注释解释了该默认值方法的实现的等价Java…

Web安全-Godzilla(哥斯拉)Webshell管理工具使用

为方便您的阅读&#xff0c;可点击下方蓝色字体&#xff0c;进行跳转↓↓↓ 01 工具下载地址02 运行环境03 工具介绍04 使用案例 01 工具下载地址 https://github.com/BeichenDream/Godzilla点击页面右侧"releases"&#xff0c;进入工具的版本下载页面。 在个人终端…

安装配置云计算模板机

安装虚拟机模板机 一、在VMware上安装Centos虚拟机二、修改虚拟机的ip、网关、DNS三、更换yum源3.1 更换本地yum源3.2 更换国内互联网Yum源 四、 安装net-tools和bash-completion五、 关闭防火墙和SELinux 学习云计算后续需要多个虚拟机&#xff0c;作为云计算集群的节点&#…

数据结构--初识栈和队列

1.栈 1.1栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&#xff09;的原则。 压…

神级 IDEA 插件!效率提升 50 倍!

安装好Intellij idea之后&#xff0c;进行如下的初始化操作&#xff0c;工作效率提升50倍。 一. 安装插件 1. Codota 代码智能提示插件 只要打出首字母就能联想出一整条语句&#xff0c;这也太智能了&#xff0c;还显示了每条语句使用频率。原因是它学习了我的项目代码&#…

4.从CPU缓存结构到原子操作

一、CPU缓存结构 1.1 CPU的多级缓存 因为CPU的计算速度非常快&#xff0c;但内存的访问速度相对较慢。因此&#xff0c;如果CPU每次都要从内存读取数据&#xff0c;会造成大量的等待时间&#xff0c;降低整体性能。 通过引入多级缓存&#xff0c;可以在CPU和内存之间建立数据…

html5学习精选5篇案例

html5学习心得1 一&#xff1a;了解HTML5前端开发技术 HTML 指的是超文本标记语言 (Hyper Text Markup Language)&#xff0c;标记语言是一套标记标签 (markup tag)&#xff0c;HTML 使用标记标签来描述网页。HTML5区别于HTML的标准&#xff0c;基于全新的规则手册&#xff0…

stm32mp157aaa裸机开发学习之led灯亮灭

asm-led.S .text .global _start _start: /**********LED1点灯**********//**********RCC章节初始化**********/ RCC_INIT:通过RCC_MP_AHB4ENSETR寄存器使能GPIOE组控制器 0x50000A28[4] 1ldr r0,0x50000A28 LED1 GPIOE10 LED3 GPIOE8ldr r1,[r0]orr r1,r1,#(0x1 << 4…

vite4+vue3:从0到1搭建vben后台管理系统(四)-封装dayjs的日历组件

前言 在后台管理系统中,封装vue的日历组件是很常见的一个功能,有时候antdvue里面的组件跟我们业务需求差异比较大时,去改antdui的官方组件比较麻烦,这个时候,我们就得自己去封装这样一个日历组件,效果如下图所示: 两种实现方式之vue2.x的实现 <template><div&…

用简单易懂的方式手写一个单例模式,看了不会来打我

文章目录 一、如何手写一个单例模式1.1 什么是单例模式1.2 单例模式的适用场景1.3 单例模式的设计原理1.4 单例模式的实现方案1.5 代码测试 一、如何手写一个单例模式 1.1 什么是单例模式 单例模式是一种常用的软件设计模式&#xff0c;它的核心是只包含一个实例的特殊类。单…

每日一道算法题--进制转换

进制转换 题目来源解题思路代码 题目来源 题目链接: 进制转换 解题思路 首先&#xff0c;从标准输入读取两个整数 M 和 N&#xff0c;分别表示待转换的十进制数和目标进制。如果输入的十进制数 M 等于 0&#xff0c;直接输出 0 并返回。判断输入的十进制数是否为负数&#xf…

网络商城源码如何选择?

电商行业的不断发展&#xff0c;越来越多的企业和商家希望建设自己的网络商城系统&#xff0c;为消费者提供更加便捷的购物体验。 但是&#xff0c;想要实现这一目标&#xff0c;选择一款优秀的网络商城系统源码至关重要。那么&#xff0c;在如此众多的商城系统源码中&#xff…

局域网内,将笔记本作为台式机的扩展屏

目录 1、驱动端下载&#xff1a; 2、笔记本下载 显示端&#xff1a; 3、连接状态&#xff1a; 4、笔记本扩展屏&#xff1a; 如果&#xff0c;都支持无线显示器的话&#xff0c;可以用window内置的winp实现&#xff0c;可惜我的台式机不支持&#xff0c;所以采用了软件的方…

结构体和数据结构--向函数传递结构体

将结构体传给函数的方式有以下三种&#xff1a; 目录 一、用结构体的单个成员作为函数参数&#xff0c;向函数传递结构体的单个成员 二、用结构体变量作函数实参&#xff0c;向函数传递结构体得完整结构 三、用结构体指针或结构体数组作函数参数&#xff0c;向函数传递结构体…

亿发软件:智能制造时代,企业为什么选择量身定制信息化软件系统

在快节奏的市场环境中&#xff0c;每个企业都寻求建立自己的管理模式&#xff0c;这往往成为竞争优势。然而&#xff0c;标准化软件产品的使用有时会扼杀企业管理的个性化&#xff0c;而僵化的制度则阻碍管理升级。此外&#xff0c;单个的部门级软件会造成信息孤岛&#xff0c;…

【电子量产工具】2.输入系统

文章目录 前言一、输入系统分析二、封装输入结构体三、底层 touchscreen四、底层 netinput五、显示管理层六、测试程序测试效果 总结 前言 最近看了 电子量产工具 这个项目&#xff0c;本专栏是对该项目的一个总结。 对于输入系统&#xff0c;这里只介绍 触摸屏线程 和 网络线…

7-WebApis-6

Web APIs - 6 目标&#xff1a;能够利用正则表达式完成小兔鲜注册页面的表单验证&#xff0c;具备常见的表单验证能力 正则表达式综合案例阶段案例 正则表达式 正则表达式&#xff08;Regular Expression是一种字符串匹配的模式&#xff08;规则&#xff09; 使用场景&#…

微信小程序申请

方案说明&#xff1a; 微信小程序申请步骤有两个过程&#xff0c;目前采用的是第二种方案 第一种方案&#xff1a;直接向微信申请微信小程序 第二种方案&#xff1a;先申请公众号后再通过公众号快速注册并申请小程序 无论申请公众号还是小程序都需要微信认证&#xff0c;微…

ubuntu18.04下安装PCL

整体步骤可参考&#xff1a;https://blog.csdn.net/qq_42257666/article/details/124574029 在本人安装过程中&#xff0c;遇到一些问题&#xff0c;做几点说明&#xff1a; 1.在配置VTK的过程中报错如下&#xff1a; 解决方法&#xff1a; sudo apt install libqt5x11extras…

Nginx【Nginx核心指令(rewrite指令、实战rewrite 、if指令、set和break指令】(六)-全面详解(学习总结---从入门到深化)

目录 Nginx核心指令_rewrite指令 Nginx核心指令_实战rewrite Nginx核心指令_if指令 Nginx核心指令_set和break指令 Nginx核心指令_rewrite指令 地址重写与地址转发 地址重写 地址重写是实际上是为了实现址标准化&#xff0c;就像访问www.baidu.cn可 以出现www.baidu.com的…