转载需注明出处:http://blog.csdn.net/minimicall?viewmode=contents,http://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(); } }