HelloWorld代码编写和调试第一部分4

本文是第一部分第四篇,第一部分共六篇文章,目录如下:

  1. 市场的动量效应
  2. 动量策略的核心盈利因子
  3. Hello World: 广为人知的动量策略
  4. Hello World: 代码编写和调试
  5. Hello World: 研究与优化
  6. 骗术大揭秘与第一部分结语

本篇介绍本部分中的Hello World动量策略进行编码实现和调试过程。

前面几篇文章说了进行了很多描述性工作,本篇就直奔主题直接开始吧。不过再次强调一下:

HelloWorld代码编写和调试第一部分4

在TBQ3中,程序使用事件驱动系统,具体的内容驱动事件可以参考官方文档中的介绍。首先一个空白的框架在TQB3中创建后,常用的代码框架格式如下:

HelloWorld代码编写和调试第一部分4

上图中包含了最常用到的5个事件处理函数。为了Hello World中的简化,我们仅仅使用OnBarClose事件处理程序,这个方法仅在Bar结束的时候调用一次,也就避免了信号闪烁。而OnBar则会在每次有Tick更新数据时都会调用。

注意:TBQ3中这种区分为策略的设计提供了更加细致化处理的可能。这种事件驱动方式可以大幅简化很多历史的策略的实现方式。如果手里有很多以前收集的旧版TB策略,应该考虑使用这种新的事件驱动逻辑去改写。

1.1)逻辑定义和代码实现

首先,我们要实现在前一篇文章中所实现的逻辑,并将其作为信号在图表中显示出来。出于简化目的,我们仅在OnBarClose事件处理函数中进行逻辑编写,以避免不必要的信号闪烁处理。代码实现如下:

HelloWorld代码编写和调试第一部分4

1.2)图表目视检查

在完成信号代码书写之后,不应该马上进行转化为策略,首先要做的是在图表上面对信号进行检查,确认信号是否符合逻辑的设计。首先新建一个K线图表,进行策略单元设置,配置好标的和数据参数,在图表上右键添加策略。添加信号策略后,可以看到信号已经显示出来了:

HelloWorld代码编写和调试第一部分4

二、信号转换为策略

如果通过目视检查确认,逻辑已经通过信号正确地表达了出来。则可以开始将信号转换为一个完整策略。

2.1)开平仓间隔限制

首先,为避免刚刚平仓后立即开仓,还需要额外添加一个小逻辑检查是否刚刚进行了平仓。通过增加一个封装方法来实现退出交易的Bar间隔数量检查:

HelloWorld代码编写和调试第一部分4

这里使用了一个状态函数: BarsSinceExit,该函数返回最近平仓的位置到当前位置的Bar计数是否满足制定间隔nBars。图中红线部分新增。

2.2)增加Buy API调用

增加Buy() API调用的过程比较简单,仅需要将之前的绘图语句:

plt.icon("开仓", low*0.998, "shangjiantou1");

替换为对应的API调用即可。因为逻辑实现在OnBarClose事件处理程序中,所以直接使用当前的Close并不存在偷价(包含滑点后),也避免了信号闪烁。此外为了避免重复信号导致的重复开仓,可以使用平台提供的一个状态函数:` MarketPosition`,持多仓时返回1,空仓返回0,仅在空仓时允许开新仓。

HelloWorld代码编写和调试第一部分4

2.3)退出机制

均线类最广为人知的退出机制是:“当价格跌破20均后,就平多仓”。出于演示目的,我们使用这个逻辑作为基础的退出机制。为了避免开仓和退出矛盾,我们还需要在之前的开仓策略中额外增加一句对收盘价是否大于maSlow的检查,同时完成退出持仓:

HelloWorld代码编写和调试第一部分4

图中红线部分为新增代码。其中额外使用了另一个状态函数:BarsSinceEntry,来来计算当前是否是新开仓的Bar。这只是一个比较好的编程习惯。对于本处的代码逻辑,从信号条件中逻辑判断:`Close > maSlow` 已经确保了当前Bar不会马上退出持仓。

2.4)Hard TPSL

作为一个很好的编程习惯,我们还应该为每个策略添加一个固定TPSL数值。这样可以保证如果基于策略逻辑的退出机制失效时,我们依然有一个兜底的风控措施。后面其他文章会详细讨论TPSL以及通过Python实现更加精细化和可靠的TPSL。这里所聊的固定TPSL并非策略的一部分,仅仅从编程的角度看是一个最后的保险措施,甚至可能几乎不会被触发。所以此时的TPSL初始数值可以根据经验设定为非常大的数值,后续根据参数优化的结果进行调整(本文后面会提到),代码修改如下:

  • 声明止盈止损全局变量:
HelloWorld代码编写和调试第一部分4

  • Buy调用后设定TPSL数值:
HelloWorld代码编写和调试第一部分4

  • 添加TPSL逻辑:
HelloWorld代码编写和调试第一部分4

2.5)图表目视检查

当完成:”逻辑 => 信号 => 策略”的转换之后,就可以通过图表进一步检查TBQ3展现出的的交易标记。当调用了Buy和Sell等API之后,TBQ3会在自动在装配了策略的图表上面执行回测,并增加交易图标显示,如下所示:

HelloWorld代码编写和调试第一部分4

同时,为了方便目视调试,代码中使用注释标记了退出类型,更方便通过图表中目视来检查退出的原因和策略逻辑是否正确。如下所示:

HelloWorld代码编写和调试第一部分4

这个目视过程和代码需要不断反复调试,直到通过目视的检查对结果满意。其中也可以使用比较简化的策略报告功能不断查看调试结果。这个过程非常像程序开发过程中的单元测试和调试开发阶段,通过不断地小样本的反复调试使程序达到可以通过冒烟测试的状态。

需要特别注意的,目视检查结合策略报告的调试非常容易导致严重的过拟合!所以需要随机调整数据时间段来避免过拟合,并且使用调试过的时间段来重新测试。

发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/774063
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!

(0)
股市刺客的头像股市刺客
上一篇 3天前
下一篇 3天前

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注