量化交易系统任务框架的演化之路(2)状态管理

44 篇文章 0 订阅
14 篇文章 1 订阅

在上一篇文章(量化交易系统任务框架的演化之路(1)定时任务)的结尾提了三个问题,今天就来第一版的解决方案。
之前的实现方案中,所有任务都是无状态、无管理的,人工干预就比较麻烦。其实解决这个问题的方法很简单,那就是增加一个“状态”,看一下这个流程图:

Created with Raphaël 2.1.2 开始 启动 running == false set running = true 执行任务 执行完毕 set running = false 结束 yes no

通过这个流程图就可以很明显的看出,重入的问题一下子就解决了。道理明白了,那么实现起来就很简单了。直接把框架代码放这里,供参考。

通过注解来表示是否为要管理的任务,在这里指定了一个属性name,管理容器可以很方便通过这个名字找到对应任务实例,完成一系列的操作。

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Component
public @interface QuantManagedTask {
    String name();
}

下面这个类是所有任务的基类,里面包含了任务的框架方法,start方法用来启动任务,启动时会检查当前任务的状态,如果没有在执行则启动,否则直接跳过;stop方法用来停止任务。

public abstract class QuantTask {
    //任务状态
    private boolean isRunning = false;

    /**
     * 启动当前任务,改变状态,执行任务
     */
    public void start(){
        //任务已经在执行中,则直接返回
        if(isRunning)
           return;
        isRunning = true;
        doTask();
        //执行完毕后停止
        stop();
    }

    // 实际的任务内容
    public abstract void doTask();

    /**
     * 停止当前任务,改变状态
     */
    public void stop(){
        isRunning = false;
    }
    /**
     * 获取任务是否在执行中
     */
    public boolean isRunning(){
        return isRunning;
    }
}

下面就是任务的管理容器,容器负责任务的启动和结束。在系统启动时,会将所有通过注解标注和继承了QuantTask的任务类预先加载进来,建立任务名称和任务实例对应的Map,那么就可以很容易的通过名字找到相应的任务实例。

@Component
public class QuantTaskManager implements BeanPostProcessor{
    protected Map<String, QuantTask> nameTaskMap = new HashMap<>();

    @Override
    public Object postProcessBeforeInitialization(Object bean, String s) throws BeansException {
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String s) throws BeansException {
        if(bean instanceof QuantTask) {
            try {
                QuantTask task = (QuantTask) bean;

                QuantManagedTask quantManagedTask = AopUtils.getTargetClass(bean).getAnnotation(QuantManagedTask.class);
                nameTaskMap.put(quantManagedTask.name(), task);
            }catch (Exception e){
                e.printStackTrace();
            }
        }
        return bean;
    }

    public void execute(String taskName) {
        nameTaskMap.get(taskName).start();
    }
}

下面这个就是一个示例任务类,可以直接通过其名字sample_task启动它。

@QuantManagedTask(name="sample_task")
public void SampleQuantTask extends QuantTask(){
    public void doTask(){
        //Do something
    }
}

增加了管理容器,我们就可以很容易的实现在页面上对任务进行管理的功能。当然了,这里只是通过一个isRunning字段解决了最简单的状态,可是有很多时候,状态可能更加复杂,尤其是在通过页面管理时,可能还要什么时候执行过、现在是什么状态等等。

现在还有一个任务依赖的问题还没有解决,那么如果基于上面的设计,应该如何去解决呢?

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
一个完整的期货量化交易系统框架通常包括以下几个关键组件: 1. 数据获取:这个组件负责从各种数据源获取市场行情数据,包括交易所提供的实时行情数据、历史行情数据以及其他衍生数据。数据获取可以通过API接口、数据库、文件等方式进行。 2. 数据处理与预处理:获取到的原始数据需要进行清洗、整理和预处理,以便于后续的策略开发和分析。这个组件涉及数据的清洗、填充缺失值、去除异常值、数据标准化等操作。 3. 策略开发与回测:这个组件是整个量化交易系统的核心部分。策略开发者根据自己的交易观点和算法逻辑,编写交易策略,并使用历史数据进行回测来评估策略的表现。回测可以通过模拟交易来验证策略的盈亏情况和风险指标。 4. 交易执行:一旦策略经过回测验证,并且满足一定的条件,就可以进入实盘交易阶段。交易执行组件负责将策略产生的交易信号发送给交易所,并实时监控市场行情和交易情况。交易执行需要考虑交易成本、风险管理、交易顺序、交易量等因素。 5. 风险管理:风险管理在期货量化交易中非常重要。这个组件负责监控策略的风险暴露,并根据预设的风险控制规则进行风险管理,包括止损、止盈、资金管理等。 6. 绩效评估与报告:绩效评估组件用于评估交易策略的绩效,包括收益率、夏普比率、最大回撤等指标。根据评估结果生成交易报告,并根据报告进行策略优化和调整。 以上是一个例子中的基本组件,不同的量化交易系统可能会有差异。这些组件可以通过Python中的各种库和工具来实现,如pandas用于数据处理,numpy用于数值计算,scikit-learn用于机器学习等。 相关问题: 1. 数据获取过程中可能会遇到哪些常见问题? 2. 策略回测时需要考虑哪些因素? 3. 交易执行过程中如何处理订单执行失败的情况? 4. 风险管理中常用的方法有哪些? 5. 如何评估一个量化交易策略的绩效?

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mydeman

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值