程序员的量化交易之路(38)--Lean之实时事件处理接口IRealTimeHandler和RealTimeEvent6

简介:

转载需注明出处:http://blog.csdn.net/minimicall?viewmode=contentshttp://cloudtrade.top/

这节开始我们要开始说明另外一个模块:实时事件处理模块。

这个模块的工作是什么呢。它就是用来设置一些在特定时间需要执行的任务。比如,每天开盘的时候,你可以做一个什么动作,比如每天收盘的时候你也可以做一个动作。当然还有更为广泛的运用。

在Lean中,是开启一个单独的线程来处理这种定时任务的。

实时事件:RealTimeEvent

实时事件处理接口:IRealTimeHandler

下面我们通过代码来说明,说明都在注释里面。废话少说:

/*
 * QUANTCONNECT.COM - Democratizing Finance, Empowering Individuals.
 * Lean Algorithmic Trading Engine v2.0. Copyright 2014 QuantConnect Corporation.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); 
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
*/

using System;
using QuantConnect.Logging;

namespace QuantConnect.Lean.Engine.RealTime
{
    /// <summary>
    /// Realtime event object for holding information on the event time and callback.
    /// 实时时间对象:保存时间相关的的事件信息和回调
    /// </summary>
    public class RealTimeEvent
    {
        /******************************************************** 
        * CLASS VARIABLES
        *********************************************************/
        // Trigger Timing
        private readonly DateTime _triggerTime;//触发时间
        private readonly Action _callback;//回调方法(没有参数、返回值)
        private readonly bool _logging;//是否写日志

        // Trigger Action
        private bool _triggered;//是否已经触发

        /******************************************************** 
        * CLASS PROPERTIES
        *********************************************************/
        /// <summary>
        /// Flag indicating the event has been triggered
        /// 事件是否已经触发了的标志
        /// </summary>
        public bool Triggered
        {
            get { return _triggered; }
        }

        /******************************************************** 
        * CONSTRUCTOR METHODS
        *********************************************************/
        /// <summary>
        /// Setup new event to fire at a specific time. Managed by a RealTimeHandler thread.
        /// 设置一个新的事件,在特定的时间触发,由RealTimeHandler线程管理
        /// </summary>
        /// <param name="triggerTime">Time of day to trigger this event</param>
        /// <param name="callback">Action to run when the time passes.</param>
        /// <param name="logging">Enable logging the realtime events</param>
        /// <seealso cref="IRealTimeHandler"/>
        public RealTimeEvent(DateTime triggerTime, Action callback, bool logging = false)
        {
            _triggered = false;
            _triggerTime = triggerTime;
            _callback = callback;
            _logging = logging;
        }

        /******************************************************** 
        * CLASS METHODS:
        *********************************************************/
        /// <summary>
        /// Scan this event to see if this real time event has been triggered.
        /// 扫描,检查该事件是否已经被触发  
        /// </summary>
        /// <param name="time">Current real or simulation time 当前时间(真实交易或者模拟交易的时间)</param>
        public void Scan(DateTime time)
        {
            if (_triggered)
            {//如果已经触发过,就直接返回,不需要返回了
                return;
            }

            //When the time passes the trigger time, trigger the event.
            //如果当前时间比设定的触发时间更晚了,那么就需要触发该事件
            if (time > _triggerTime)
            {
                _triggered = true;//标志为已经触发

                try
                {
                    if (_logging)
                    {
                        Log.Trace("RealTimeEvent.Scan(): Eventhandler Called: " + time.ToString("u"));
                    }
                    _callback();//调用回调函数
                }
                catch (Exception err)
                {
                    Log.Error("RealTimeEvent.Scan(): Error in callback: " + err.Message);
                }
            }
        }

        /// <summary>
        /// Reset the triggered flag.
        /// </summary>
        public void Reset()
        {
            _triggered = false;
        }
    }
}


实时事件处理接口:

/*
 * QUANTCONNECT.COM - Democratizing Finance, Empowering Individuals.
 * Lean Algorithmic Trading Engine v2.0. Copyright 2014 QuantConnect Corporation.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); 
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
*/

using System;
using System.Collections.Generic;
using QuantConnect.Packets;

namespace QuantConnect.Lean.Engine.RealTime
{
    /// <summary>
    /// Real time event handler, trigger functions at regular or pretimed intervals
    /// 实时事件处理,周期性触发回调方法,或者在设定的时间触发
    /// </summary>
    public interface IRealTimeHandler
    {
        /******************************************************** 
        * INTERFACE PROPERTIES
        *********************************************************/
        /// <summary>
        /// The real time handlers internal record of current time used to scan the events.
        /// 现在的时间
        /// </summary>
        DateTime Time 
        { 
            get;
        }

        /// <summary>
        /// List of events we're monitoring.
        /// 我们监控的事件列表 
        /// </summary>
        List<RealTimeEvent> Events
        {
            get;
        }

        /// <summary>
        /// Thread status flag.
        /// 本线程是否活跃
        /// </summary> 
        bool IsActive
        {
            get;
        }

        /// <summary>
        /// Data for the Market Open Hours Today
        /// 市场交易时间
        /// </summary>
        Dictionary<SecurityType, MarketToday> MarketToday
        {
            get;
        }

        /******************************************************** 
        * INTERFACE METHODS
        *********************************************************/
        /// <summary>
        /// Main entry point to scan and trigger the realtime events.
        /// 线程入口
        /// </summary>
        void Run();

        /// <summary>
        /// Given a list of events, set it up for this day.
        /// </summary>
        void SetupEvents(DateTime day);

        /// <summary>
        /// Add a new event to the processing list
        /// 增加事件
        /// </summary>
        /// <param name="newEvent">Event information</param>
        void AddEvent(RealTimeEvent newEvent);
        
        /// <summary>
        /// Trigger a scan of the events.
        /// 触发事件
        /// </summary>
        void ScanEvents();

        /// <summary>
        /// Reset all the event flags for a new day.
        /// 重置所有事件标志,为新的一天
        /// </summary>
        /// <remarks>Realtime events are setup as a timespan hours since </remarks>
        void ResetEvents();

        /// <summary>
        /// Clear all the events in the list.
        /// </summary>
        void ClearEvents();

        /// <summary>
        /// Set the current time for the event scanner (so we can use same code for backtesting and live events)
        /// 设置现在的时间
        /// </summary>
        /// <param name="time">Current real or backtest time.</param>
        void SetTime(DateTime time);

        /// <summary>
        /// Trigger and exit signal to terminate real time event scanner.
        /// 退出该线程
        /// </summary>
        void Exit();
    }
}



相关文章
|
7月前
|
Python
【速看】如何通过合理的封装,让你的自动化脚本更上一层楼!
【速看】如何通过合理的封装,让你的自动化脚本更上一层楼!
|
4月前
|
图形学 C# 开发者
全面掌握Unity游戏开发核心技术:C#脚本编程从入门到精通——详解生命周期方法、事件处理与面向对象设计,助你打造高效稳定的互动娱乐体验
【8月更文挑战第31天】Unity 是一款强大的游戏开发平台,支持多种编程语言,其中 C# 最为常用。本文介绍 C# 在 Unity 中的应用,涵盖脚本生命周期、常用函数、事件处理及面向对象编程等核心概念。通过具体示例,展示如何编写有效的 C# 脚本,包括 Start、Update 和 LateUpdate 等生命周期方法,以及碰撞检测和类继承等高级技巧,帮助开发者掌握 Unity 脚本编程基础,提升游戏开发效率。
92 0
|
4月前
|
前端开发 开发者 C#
深度解析 Uno Platform 中的 MVVM 模式:从理论到实践的全方位指南,助你轻松掌握通过 C# 与 XAML 构建高效可维护的跨平台应用秘籍
【8月更文挑战第31天】本文详细介绍如何在优秀的跨平台 UI 框架 Uno Platform 中实施 MVVM(Model-View-ViewModel)模式,通过一个简单的待办事项列表应用演示其实现过程。MVVM 模式有助于分离视图层与业务逻辑层,提升代码组织性、易测性和可维护性。Uno Platform 的数据绑定机制使视图与模型间的同步变得高效简便。文章通过构造 `TodoListViewModel` 类及其相关视图,展示了如何解耦视图与模型,实现动态数据绑定及命令处理,从而提高代码质量和开发效率。通过这一模式,开发者能更轻松地构建复杂的跨平台应用。
59 0
|
数据采集 消息中间件 XML
【Esper技术专题】一个简单的事件响应功能的案例(2)复杂事件处理引擎
【Esper技术专题】一个简单的事件响应功能的案例(2)复杂事件处理引擎
320 0
|
存储 安全 算法
STEPN链游模式系统开发详情及原理分析
区块链技术这5大特征,使网络数据更加安全
STEPN链游模式系统开发详情及原理分析
|
小程序 UED
小程序开发-第三章第三节正在加载,loading状态-全栈工程师之路-中级篇
小程序开发-第三章第三节正在加载,loading状态-全栈工程师之路-中级篇
454 0
小程序开发-第三章第三节正在加载,loading状态-全栈工程师之路-中级篇
|
XML 移动开发 前端开发
这16种原生函数和属性的区别,你真的知道吗? 精心收集,高级前端必备知识,快快打包带走
原生内置了很多API, 作用类似,却也有差千差万别,了解其区别,掌握前端基础,是修炼上层,成为前端高级工程师的必备知识,让我们一起来分类归纳,一起成长吧。
201 0
这16种原生函数和属性的区别,你真的知道吗? 精心收集,高级前端必备知识,快快打包带走