经常有设计策略的朋友问我,如何给策略设计定时功能,让策略在指定的时间去处理某些任务。例如,一些日内策略,需要在下午收盘前平仓。类似这样的需求在策略中要如何设计才好。一个策略里面可能要用到很多时间控制,这样来说我们把时间控制功能封装起来最好,最大程度降低时间控制代码与策略的耦合性,让这个时间控制模块可以复用,并且在使用方面简洁易懂。

设计一个“闹钟”

// triggerTime : 14:58:00
function CreateAlarmClock(triggerHour, triggerMinute) { var self = {}                           // 构造的对象// 以下给构造的对象设置成员、函数self.isTrigger = false                  // 当天是否触发过self.triggerHour = triggerHour          // 计划触发的小时self.triggerMinute = triggerMinute      // 计划触发的分钟self.nowDay = new Date().getDay()       // 当前时间是哪日self.Check = function() {               // 检查函数,检查触发,触发返回true,未触发返回false    var t = new Date()                  // 获取当前时间对象var hour = t.getHours()             // 获取当前小数:0~23var minute = t.getMinutes()         // 获取当前分钟:0~59var day = t.getDay()                // 获取当前天数if (day != self.nowDay) {           // 判断,如果当前天,不等于记录的当天,重置触发标记为未触发,更新记录的天数self.isTrigger = falseself.nowDay = day}if (self.isTrigger == false && hour == self.triggerHour && minute >= self.triggerMinute) {  // 判断时间是否触发,如果符合条件,设置标记isTrigger为true表示已经触发过self.isTrigger = truereturn true}return false    // 不符合触发条件,即为未触发}return self         // 返回构造完成的对象
}

我们设计并实现了一个创建闹钟对象的函数(可以理解为构造函数),其它语言直接可以设计一个闹钟类(例如使用Python,后续我们用Python实现一个)。

设计好构造“闹钟”对象的函数,在使用时只需一行代码即可创建一个“闹钟”对象。

var t = CreateAlarmClock(14, 58)

例如,创建一个对象t,并且定时每天14:58触发。
可以再创建一个对象t1,定时每天9:00触发。

var t1 = CreateAlarmClock(9, 0)

测试策略

我们写一个测试用的策略,策略使用最简单的均线系统,策略只是用来测试而已不用在意收益情况。
策略计划在每天9:00开盘时,根据日均线金叉、死叉判定开仓(做多、做空、不交易),并且在下午14:58时平仓(15:00收盘)。

function CreateAlarmClock(triggerHour, triggerMinute) { var self = {}                           // 构造的对象// 以下给构造的对象设置成员、函数self.isTrigger = false                  // 当天是否触发过self.triggerHour = triggerHour          // 计划触发的小时self.triggerMinute = triggerMinute      // 计划触发的分钟self.nowDay = new Date().getDay()       // 当前时间是哪日self.Check = function() {               // 检查函数,检查触发,触发返回true,未触发返回false    var t = new Date()                  // 获取当前时间对象var hour = t.getHours()             // 获取当前小数:0~23var minute = t.getMinutes()         // 获取当前分钟:0~59var day = t.getDay()                // 获取当前天数if (day != self.nowDay) {           // 判断,如果当前天,不等于记录的当天,重置触发标记为未触发,更新记录的天数self.isTrigger = falseself.nowDay = day}if (self.isTrigger == false && hour == self.triggerHour && minute >= self.triggerMinute) {  // 判断时间是否触发,如果符合条件,设置标记isTrigger为true表示已经触发过self.isTrigger = truereturn true}return false    // 不符合触发条件,即为未触发}return self         // 返回构造完成的对象
}function main() {var q = $.NewTaskQueue()var p = $.NewPositionManager()// 可以写: var t = CreateAlarmClock(14, 58)// 可以写: var t1 = CreateAlarmClock(9, 0)var symbol = "i2009"  while (true) {if (exchange.IO("status")) {exchange.SetContractType(symbol)var r = exchange.GetRecords()if(!r || r.length < 20) {Sleep(500)continue   }if (/*判断9:00开仓的条件*/) {     // 可以写: t1.Check()var fast = TA.MA(r, 2)var slow = TA.MA(r, 5)var direction = ""if (_Cross(fast, slow) == 1) {direction = "buy"} else if(_Cross(fast, slow) == -1) {direction = "sell"}if(direction != "") {q.pushTask(exchange, symbol, direction, 1, function(task, ret) {Log(task.desc, ret)})}}if (/*判断14:58临近收盘平仓的条件*/) {   // 可以写: t.Check()p.CoverAll()}q.poll()LogStatus(_D())} else {LogStatus(_D())}Sleep(500)}
}

在策略中放入我们已经实现的CreateAlarmClock函数,并且在main函数开始部分构造两个“闹钟”对象。在策略判断开仓、平仓的位置,加上“闹钟”对象调用Check函数的代码,如代码中注释掉的部分。

回测运行

可以看到回测,早上9点之后开仓,下午14:58开始平仓。

也可以用于多品种策略,在多品种策略中可以创建多个这样的“闹钟”对象,用于多品种的时间控制,互不影响。

Python语言实现闹钟类

实现以及测试代码:

import time
class AlarmClock:def __init__(self, triggerHour, triggerMinute):self.isTrigger = False self.triggerHour = triggerHourself.triggerMinute = triggerMinuteself.nowDay = time.localtime(time.time()).tm_wdaydef Check(self):t = time.localtime(time.time())hour = t.tm_hourminute = t.tm_minday = t.tm_wdayif day != self.nowDay:self.isTrigger = Falseself.nowDay = dayif self.isTrigger == False and hour == self.triggerHour and minute >= self.triggerMinute:self.isTrigger = Truereturn Truereturn False def main():t1 = AlarmClock(14,58)t2 = AlarmClock(9, 0)while True:if exchange.IO("status"):LogStatus(_D(), "已经连接!")exchange.SetContractType("rb2010")ticker = exchange.GetTicker()if t1.Check():Log("收盘", "#FF0000")if t2.Check():Log("开盘", "#CD32CD")else :LogStatus(_D(), "未连接!")Sleep(500)

回测测试运行:

需要注意的是,回测测试运行,底层K线周期不能设置过大,否则可能直接跳过时间检测的点导致没有触发。

策略代码仅仅抛砖引玉提供思路,感谢阅读。

中获取当月天数_给商品期货策略加上一个闹钟--策略中的定时设计相关推荐

  1. SQL获取当月天数的几种方法

    SQL获取当月天数的几种方法 原文:SQL获取当月天数的几种方法 日期直接减去int类型的数字 等于 DATEADD(DAY,- 数字,日期) 下面三种方法: 1,日期加一个月减去当前天数,相当于这个 ...

  2. PHP获取当月天数,获取当月的每天的开始和结束的时间戳,获取当月每号

    由于经常要写导单和数据分析功能,所以要获取什么时间的数据,想什么当天,周,年,月之类的时间格式都很好获取.我今天在这里为大家提供的是当月每天的开始和结束的时间格式. 希望能帮到大家!!! # 获取当月 ...

  3. 将类的定义放在头文件中,把成员函数的实现代码放在一个cpp文件中

    将类的定义放在头文件中,把成员函数的实现代码放在一个cpp文件中 写这种.h和.cpp文件分开的大程序,虽然对很多人来说很简单,对自己来说算是第一次吧,好好学C++,加油~ 题目:定义Point类,由 ...

  4. php从内存中获取源码_【PHP7源码分析】PHP内存管理

    作者: 顺风车运营研发团队 李乐 第一章 从操作系统内存管理说起 程序是代码和数据的集合,进程是运行着的程序:操作系统需要为进程分配内存:进程运行完毕需要释放内存:内存管理就是内存的分配和释放: 1. ...

  5. php获取当月天数及当月第一天及最后一天、上月第一天及最后一天实现方法

    1.获取上个月第一天及最后一天. 上个月第一天: echo date('Y-m-d', strtotime(date('Y-m-01') . ' -1 month')); // 计算出本月第一天再减一 ...

  6. 无法从套接字中获取更多数据_数据科学中应引起更多关注的一个组成部分

    无法从套接字中获取更多数据 介绍 (Introduction) Data science, machine learning, artificial intelligence, those terms ...

  7. c++ map 获取key列表_一日一技:举例说明python中的map()方法

    map()函数 Python 的map()方法,作为输入提供的迭代器的所有元素应用函数. 例如,迭代器可以是列表,元组,集合,字典,字符串,并且它返回可迭代的映射对象. 另外,map()是python ...

  8. c++中获取蓝图组件_蓝图C++混合编程

    注意事项 1)模块接口(API):对于一些需要被模块外部访问的函数和类,需要通过 *_API 的宏标记出来.每个被暴露在外的单项都会带来编译时间的额外消耗,因此请务必仅暴露出必须暴露的接口.如果外部只 ...

  9. 如何从stackoverflow的api 中获取是数据_如何修复Vue中的 “this is undefined” 问题

    当我们使用 Vue 在愉快的开发项目的时候,突然报了一个错误: this is undefined 别担心,不只有你一个人,我也经常遇到这个问题很多次,接下我们一起来看看如何解决这个问题. 一个可能的 ...

  10. KSO-sql server获取当月天数

    sqlserver查询当前月份的天数–思路当前月份+1,就是下个月,然后用下个月的1号减一,就得到当前月份的最后一天,这样就知道当前月份有多少天了–用到的函数 getdate()当前的日期 datea ...

最新文章

  1. 沙龙报名 | 探索新零售时代的数字化创新
  2. String Typing CodeForces - 954B
  3. python 编程该看那些书籍_我用python5年后,我发现学python编程必看的三本书!
  4. 适合 Kubernetes 初学者的一些实战练习 (三)
  5. symfony2的中文视频教程更新中(原创),对Symfony感兴趣的学员可以看下
  6. Delphi 2010 新增功能之: Rtti 单元(5): 获取方法的更多信息
  7. Spring Cloud Sleuth服务链路跟踪之入门篇(学习总结)
  8. Ubuntu安装gcc 以及g++
  9. 各个国家/地区以及对应的手机区号
  10. OA协同办公系统-day01
  11. Google Chrome v90.0.4430.212 正式版下载
  12. Pro Tools 贴士- 使用Snapper快速试听和导入音频素材
  13. 口语语汇单词篇(7)
  14. 全新整理:微软、谷歌、百度等公司经典面试100题[第101-160题]
  15. python哪个找工作最好_为何python不好找工作
  16. 推荐免费小巧图片大小处理工具--Image Resizer for Windows
  17. idea出现 淇℃伅 乱码
  18. 什么是 MEMORY.DMP 文件 ?
  19. 微信小程序点击事件(bindtap)传递参数
  20. macd的python代码同花顺_同花顺顶级MACD指标公式源码-同花顺公式 -程序化交易(CXH99.COM)...

热门文章

  1. SQL*Plus和iSQL*Plus的区别(oracle)
  2. html权重值_实战:网站权重快速提高权重绝招(10天权3)
  3. @RequestBody 的使用方法和注意事项
  4. 并发修改异常ConcurrentModificationException详解
  5. Spring源码系列 — BeanDefinition
  6. Python 面向对象3-类变量与实例变量
  7. 自动化测试基础篇--Selenium等待时间
  8. JavaScript专题之跟着 underscore 学节流
  9. Hibernate 的HQL和sql有什么区别
  10. 软件教程给MyEclipse 10增加SVN功能