掘金社区
终端版本:3.x
编程语言:C#
SDK版本: 3.0.7 x64
最近在回测和仿真过程, 频繁出现程序崩溃现象, 而且是捕获不到任何异常的那种:
由于崩溃的时间点是随机的, 很难再现. 经过一个多星期的反复折腾, 虽然还是没有真正找到问题所在, 到时找到了一种极端"订阅"/"退订"用法, 就是订阅某些证券代码然后马上退订, 就会出现崩溃.
现实中订阅后马上退订的做法很少会碰到. 其实我无法确定问题到底处在前端还是后端, 猜测可能是后台有一些异步处理来不及完成导致的.
考虑到出现崩溃这样的问题总是要解决的, 因此附上测试代码, 供你们参考.
下面的代码每次运行都会崩溃:
namespace TimedTask01
{
public class MyStrategy : Strategy
{
int barReceived = 0; //记录收到Bar的次数
DateTime StartTimeOfDay = DateTime.Now; //回测到每一天的开始时间(系统时间)
DateTime FinishTimeOfDay = DateTime.Now; //回测每一天的结束时间(系统时间)
string Symbels1 = "SHSE.600004,SHSE.600011,SHSE.600008,SHSE.600009,SHSE.600010,SHSE.600000,SHSE.600012,SHSE.600015,SHSE.600017,SHSE.600021";
public MyStrategy(string token, string strategyId, StrategyMode mode) : base(token, strategyId, mode) { }
//重写OnInit事件,进行策略开发
public override void OnInit()
{
System.Console.WriteLine("OnInit");
//设置定时任务
Schedule("1d", "09:10:00");
Schedule("1d", "12:00:00");
Schedule("1d", "15:20:00");
return;
}
//定时任务触发事件
public override void OnSchedule(string data_rule, string timeRule)
{
int retCode;
if (timeRule == "09:10:00") //股市开盘前
{
StartTimeOfDay = DateTime.Now; //设置一天的开始时间, 用于计算回测一天所需的时间
}
else if (timeRule == "12:00:00") //午间休盘时间
{
retCode = Subscribe(Symbels1, "60s"); //订阅
if (retCode != 0)
{
System.Console.WriteLine("订阅代码<" + Symbels1 + ">返回错误, 错误号: " + retCode);
}
retCode = Unsubscribe(Symbels1, "60s"); //退订
if (retCode != 0)
{
System.Console.WriteLine("退订代码<" + Symbels1 + ">返回错误, 错误号: " + retCode);
}
}
else if (timeRule == "15:20:00") //股市收盘后
{
//计算回测一天所需的时间, 显示一天回测结束
DateTime thisDay = Now().Date;
DateTime thisTime = DateTime.Now;
System.Console.WriteLine("回测日期<" + thisDay.ToString("yyyy-MM-dd") + ">完成; 收到Bar: " + barReceived +
"; 工作用时: " + (thisTime - StartTimeOfDay).TotalSeconds.ToString("0.00秒") +
"; 无工耗时: " + (StartTimeOfDay - FinishTimeOfDay).TotalSeconds.ToString("0.00秒"));
barReceived = 0;
FinishTimeOfDay = DateTime.Now;
}
}
//重写OnBar事件
public override void OnBar(Bar bar)
{
barReceived++;
}
}
class Program
{
static void Main(string[] args)
{
MyStrategy s = new MyStrategy("...", "...", StrategyMode.MODE_BACKTEST);
s.SetBacktestConfig("2018-11-20 08:00:00", "2018-12-31 20:00:00");
s.Run();
System.Console.WriteLine("回测完成!");
System.Console.Read();
}
}
}