从0开始学期货编程与量化之六:从一个简单的日线|小时级别的趋势策略来举说明如何写一个完整的策略
- UID
- 2
- 积分
- 2874604
- 威望
- 1387331 布
- 龙e币
- 1487273 刀
- 在线时间
- 13155 小时
- 注册时间
- 2009-12-3
- 最后登录
- 2024-11-24
|
从0开始学期货编程与量化之六:从一个简单的日线|小时级别的趋势策略来举说明如何写一个完整的策略
今天先写一个提纲。明天具体写。策略是这样的:
均线趋势策略内容:
1、以20周期黄金均线做为进也场依据。价格站上均线则做多,平空单;价格跌破20周期均线则平多单开空单。
2、没有加仓和减仓的动作。
3、没有资金管理动作。
4、目标品种的周期在小时线和日线上面,同时后面测试时也是按照这两个周期效果进行分析。
5、测试效果后按特定品种(比如螺纹)做参数优化,看在参数优化前和优化后有什么变动。并通过其它品种测试这种优化有没有存在过度拟合。(就是这种优化有没有同性?还是不同的品种的适合的周期都是不一样的。当然后面这个是结论,但是我要通过测试跟您说为什么会得出后面这一个结论。)
6、通过测试和跑一段时间盘子,看看这种策略有没有跑实盘的可能?亏太多不行,赚钱是前提,至少赚的要比亏的多一倍左右才行的,亏太多就很难能坚持下去的,毕竟程序化也是有不少的成本的(电脑成本与维护成本,电费,宽带费用。) |
论坛官方微信、群(期货热点、量化探讨、开户与绑定实盘)
|
|
|
|
|
|
- UID
- 2
- 积分
- 2874604
- 威望
- 1387331 布
- 龙e币
- 1487273 刀
- 在线时间
- 13155 小时
- 注册时间
- 2009-12-3
- 最后登录
- 2024-11-24
|
第一步:我要引用价格。
在K线图(蜡烛图)上期货品种有这些要素:开盘价,最高价,最低价,收盘价 。在盘中当前的K线图上只有一个价格是确定的就是开盘价,最高价与最低价以及收盘价,因为这要K线没有走完。所以这些价格随时可能改变。能明白?不能明白的,回去看看盘面上盯一个K线的,看他忽上忽下的,感受一下。在一根K线没有走完前,最新的价格表示方法是(收盘价也叫close);最后一个即时价格才是最终的固定的收盘价。在盘中只要这根K线没有走完,这根K线的收盘价就会一直不停的改变,要是创新高或新低了,最高价和最低价也要改变。不明白的,面壁沉思一下。
四个价格:开盘价(open),最高价(high),最低价(low),收盘价(close);
第二步、我要做20周期的收盘价均价也就是20周期的均线。
(第1个周期的收盘价+第2周期收盘价++++第20个周期的收盘价)/20 就得出最新的这根K线对应的20周期收盘价均线了。这个求均价的公式是AverageFC(收盘价,周期);因为我要求20周期的收盘价平均价格。这个平均是简单算数平均。也就是20个收盘价加起来再除20;
我为了能看到效果,所以我想让这根均线在技术图上显示出来,这样我就知道画的这个均线对不对。有必要时还要和其它软件比较说文华财经,博易大师对比一下,看看画的对不对。 |
|
|
|
|
|
|
- UID
- 2
- 积分
- 2874604
- 威望
- 1387331 布
- 龙e币
- 1487273 刀
- 在线时间
- 13155 小时
- 注册时间
- 2009-12-3
- 最后登录
- 2024-11-24
|
源码如下:
- //------------------------------------------------------------------------
- // 简称: my_20ma
- // 名称:
- // 类别: 公式应用
- // 类型: 用户应用
- //------------------------------------------------------------------------
- Params
- Numeric Para1(20); //均线的周期
- Vars
- Bool Condition1; //进出条件,一会用到
- Bool Condition2; //进出条件,一会用到
-
- NumericSeries ma20; //我给均线起个名字,记的只能用英文和或英文+数字
- Begin{
- ma20 = AverageFC(Close,para1);
-
- PlotNumeric("20周期均线",ma20); //画一条20周期收盘价平均价格的线
-
- }
- End
- //------------------------------------------------------------------------
- // 编译版本 GS2015.12.25
- // 用户版本 2017/11/02 14:24:32
- // 版权所有 yezi08895
- // 更改声明 TradeBlazer Software保留对TradeBlazer平台
- // 每一版本的TradeBlazer公式修改和重写的权利
- //------------------------------------------------------------------------
复制代码
显效如下:
|
|
|
|
|
|
|
- UID
- 2
- 积分
- 2874604
- 威望
- 1387331 布
- 龙e币
- 1487273 刀
- 在线时间
- 13155 小时
- 注册时间
- 2009-12-3
- 最后登录
- 2024-11-24
|
第三步:我要写进出场的策略
大家思考一下问题,还是刚才的。在当前K线没有走完之前只有开盘价是确定的。其它的三个都是不确定的。那么我要是将当前这个周期也算均线的这个20个周期的平均里面会出现什么情况?最新的这个20周期的均线的值会一直不停的变动,忽大忽小。因为前19个收盘价已经确定了,但是第20个收盘价没有出来,我用CLOSE来表示的收盘价,但是在当前K线没有走完之前,这个CLOSE也叫即时价格。虽然价格上下波动对均线的影响只有1/20那么大,但是很多时候我们进场或不进场就关注最后一个最小的价位。上去就条件达到,上不去就没有达到条件。
若是我按软件上面默认的方法就会出现这样的问题:
1、某一个时刻价格盘中反弹的厉害,K线已经站上20周期均线了,软件发出了开仓的执令,但是一会价格又下来了,但是指令已经发出去的,成立了,已经没法再退回去的。一会价格又上去了,软件又发出了一个指令。一会又下来了,指令已经成交了,在一个K线的周期内我重复发出了N个的指令,这并不是我们希望的,这种叫信号闪烁,也叫重复下单。我们要规避了才行的。
2、关于进场的悖论
我们想按价格站上20周期均线进场,其实这个是很不严谨的。因为只有收盘时才能确认有没有站上,但是收盘了还怎么做啊。是这个样子吧?
所以这里要进行一下处理。实现我们的想法。
第一个的处理方式是改一下均线或在下一个K线时进场。具体是这样的,我用昨天的均线的值来比较今天的价格,昨天的20周期均线价格是确定的。均线和K线比较时均线我选择昨天的。今天的收盘价我不用收盘价来比较,我用最高价来比较。想象一下,昨天的时候收盘价与K线是一种状态,以K线在20周期均线下面来说明.今天开盘后价格一直在波动,突破价格上冲。一瞬间价格冲到超过昨天均线1个点的位置了,同时这时的最高价和收盘价是同个价格,反手做多的信号出现了。然后过一会价格回落了。若是我继续用盘中的收盘价来比较均线的话,信号就是又没有了。信号出现了闪烁。但是我若是用最高价来比较的话,这个成立的信号并不会因为价格下跌而消失。信号会一直存在着。过一段时间价格再创新高,有了新的最高价,但是之前的那个最高价大于均线值仍然是成立的。假设昨天的均线是19.今天开始的最高是25,一会又出现了35的最高。,但是并不会改变25 > 19的这个逻辑正确条件。所以信号闪烁的问题解决了。
这时有人会说了,我的思路是按价格站上20周期均线进出的啊,你现在弄的这个不是我所想的啊。均线前一值大于当天的最高价进场。这不是我想要的呢。下面还有一种解决方式。
第二个处理方式就是均线还是按正常的算法来。但是收盘时没法再进了啊,那种按下一根K线的开盘价进,这样也不会出现信号闪烁。你要是想说我就想当天进的啊。这个就是要做第三个处理方法了。
第三个处理方式:靠软件环境设置,设定为在临收盘前5秒、10秒或15秒确认信号成立进场。收盘后再复查,要是在最后的几秒内又不成立了,就在下一个开盘时平掉。
通过上面的叙述,我们应该能看到我们人工交易过程中一个很简单的思路量化起来是很复杂的。原因在于我们思维是跳跃性的,说话逻辑性不强,不严谨。所以有很多网友跟我说以为很好写的,但是实际写起来超麻烦。光进出场就有三种处理方式。若是加上资金管理,就更麻烦了。
下面我按第二种方式写出来。效果会比人工在看K线时进场要差一点,毕竟任何一个拟合的处理都不如人工的处理。这就是为什么好多人认为很好的策略,实际上跑不下去的原因。 |
|
|
|
|
|
|
- UID
- 2
- 积分
- 2874604
- 威望
- 1387331 布
- 龙e币
- 1487273 刀
- 在线时间
- 13155 小时
- 注册时间
- 2009-12-3
- 最后登录
- 2024-11-24
|
先上测试用的源码:
- //------------------------------------------------------------------------
- // 简称: my_20ma
- // 名称:
- // 类别: 公式应用
- // 类型: 用户应用
- //------------------------------------------------------------------------
- Params //这个参数设置
- Numeric Para1(20); //均线的周期
- Vars //
- Bool Condition1; //进出条件,一会用到
- Bool Condition2; //进出条件,一会用到
-
- NumericSeries ma20; //我给均线起个名字,记的只能用英文和或英文+数字
- Begin{
- ma20 = AverageFC(Close,para1); //做一条20周期的均线
-
- Condition1 = CrossOver(close,ma20); //收盘价上穿20周期均线
- Condition2 = CrossUnder(Close,ma20); //收盘价下穿20周期均线
- if (condition1){
- Sell(1,close); //先平仓,再开仓
- Buy(1,close);
- }
- if (condition2){
- BuyToCover(1,close);
- SellShort(1,close);
- }
- PlotNumeric("20周期均线",ma20); //画一条20周期收盘价平均价格的线
- }
- End
- //------------------------------------------------------------------------
- // 编译版本 GS2015.12.25
- // 用户版本 2017/11/02 14:24:32
- // 版权所有 yezi08895
- // 更改声明 TradeBlazer Software保留对TradeBlazer平台
- // 每一版本的TradeBlazer公式修改和重写的权利
- //------------------------------------------------------------------------
复制代码 |
|
|
|
|
|
|
- UID
- 2
- 积分
- 2874604
- 威望
- 1387331 布
- 龙e币
- 1487273 刀
- 在线时间
- 13155 小时
- 注册时间
- 2009-12-3
- 最后登录
- 2024-11-24
|
下面是测试或收盘时显示的样子,用来测试的。过几天跑策略时我会将进也场进行一些设置。 |
|
|
|
|
|
|
- UID
- 18377
- 积分
- 2449
- 威望
- 1275 布
- 龙e币
- 1174 刀
- 在线时间
- 1 小时
- 注册时间
- 2018-1-19
- 最后登录
- 2018-3-4
|
确实很麻烦 老大是牛人。。。。。。。。。。。。。。。 |
|
|
|
|
|
|