掘金社区

反馈: 回调时出现程序崩溃现象Pinned highlighted

GloryYan 发表在问题反馈 2019-03-01 19:42:14

问题反馈
191
3
0

终端版本:3.x
编程语言:C#
SDK版本: 3.0.7 x64

@喜羊羊

最近在回测和仿真过程, 频繁出现程序崩溃现象, 而且是捕获不到任何异常的那种:
0_1551437952842_无标题.jpg

由于崩溃的时间点是随机的, 很难再现. 经过一个多星期的反复折腾, 虽然还是没有真正找到问题所在, 到时找到了一种极端"订阅"/"退订"用法, 就是订阅某些证券代码然后马上退订, 就会出现崩溃.

现实中订阅后马上退订的做法很少会碰到. 其实我无法确定问题到底处在前端还是后端, 猜测可能是后台有一些异步处理来不及完成导致的.
考虑到出现崩溃这样的问题总是要解决的, 因此附上测试代码, 供你们参考.

下面的代码每次运行都会崩溃:
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();
    }
}

}

评论: 3
  • 感谢反馈, 正在积极排查
    建议不要动态调用订阅 退订接口, 看您的代码应该是想测试每天60s bar所用时间, 但实际上调用订阅接口后直接调退订接口相当于没有订阅, 什么数据也得不到
    0_1551682117737_8451f265-421d-4375-84ec-4b6a6c54337e-image.png
    0_1551682145236_c34498d2-ae65-453e-9186-35316e6589ba-image.png

    2019-03-04 14:49:07
  • @喜羊羊 感谢回复. 我借用了测试回测用时的程序, 原本退订在收盘后.

    说到回测用时也很奇怪, 程序一开始每天用时很短, 差不多回测到一个多月时开始变慢, 最后几天又变快了. 不知什么原因?


    2019-03-05 08:46:29
  • @喜羊羊 刚才忘说了, 我已经发现在退订前加一个sleep(50)就不会崩溃了, 因此建议重点排查后台程序是否忽略了加锁问题.

    2019-03-05 09:00:47

Looks like your connection to 掘金量化社区 - 量化交易者的策略交流学习社区 was lost, please wait while we try to reconnect.