程序化交易开发者的重要经验

Discussion in 'Philosophy and Strategy' started by mashall, Feb 14, 2013.

  1. 一定要建立一套自己的规范

    常用代码库:比如下单,平仓,资金。。。
    常用框架库:比如趋势、多单加仓,一单,逆势。。。
    编程规范:比如颜色,输出,错误处理,编程风格。。。

    可以确保在最快的时间里,构建自己的策略,而不是把大量的时间浪费在程序之中。

    在下建立了这样的库,才有点体会,这些东西是一个老手与一个新手之间技术壁垒。

    这些年,我手下有不少程序员过,但是我痛苦的事情很多,有一个就是很难写出高质量,容易检验的程序,这一关过不去,别提什么策略与团队了。

    各种体会,酸甜苦辣。。。。。。
     
  2. 你找错人了~让程序员搞策略,南辕北辙的
     
  3. 程序员写程序,上文说到了。
     
  4. 你提的这些是必要的CODING规范啊。模块化+规范化(编程风格甚至STL模板)+基础库,可以在无谓的重复工作上减少人力开销一并减少花在调试上的精力。如果没有项目经理事先做好规范,每个程序员都有自己的编程风格,很容易搞成跟你玩黑盒游戏。
     
  5. 对头。但是和普通开发程序模板不同的是,就是策略的模板不容易构建,应用处理的代码模板相对容易构建。

    写应用软件和写策略不同地方很多,这个方面缺少规范。
     
  6. 系统的构架和平台选对了,事倍功半。
    实际上你需要一个订单管理系统,
    更需要一个策略驱动引擎,
    装入不同策略之后,系统就可以运行,更多的工作其实是监控。
     
  7. 同意expresso兄,分開策略与下單系統。
    請教expresso兄 ,把xp运行在ram 上,
    在外匯實際交易中有沒有明显的优勢 。
     
  8. 单就it平台来说,使用商业化产品或外包定制,必要须it效率优化代码用高级人才我认为是最好的。
    一般说来,自行开发的成本是极其高昂的,而且不专业,把需要专业的事情交给专业的人来办,不是更好木?
     
  9. 无,反而有劣势。
     
  10. xp运行在ram上面没有试过,
    我试过在windows 8上面虚拟xp,
    然后把虚拟机的文件全部放在ram上面,
    用amibroker回测时快一点点,
    但是意义不大,大多数数据其实已经在内存里面。

    实战就更不用,我的最小扫描时间是4分钟。 :)
    Not a fan for HFT ...
     
  11. 自己的代码库,包括测试,下单,监控等模块是必须的,这些是程序交易的基础建设。然后可以把时间放到真正的策略研发上,这是盈利或亏损的决定因素,和会不会编程关系不大。
     
  12. 模块化是必须的,自己开发软件应该参考下现有软件的架构,比如openquant等。我的系统分数据(接收、保存、读取+独立的K线数据生成模块)、回测、实盘、监控等模块。架构搭好以后,搞策略就简单多了。以均线策略为例,show一下自己的策略编写部分,请各位提个意见:
    public class MAStrategy : Strategy
    {
    DateTime exitingTime;//尾盘平仓时间

    FutureDataSeries dataSeries;
    MA ma5;
    MA ma20;

    public MAStrategy(params string[] paras)
    : base("MAStrategy")
    {
    string instrument = paras[0];
    //注册合约
    RegDataServer(instrument);
    //注册策略所用资金量
    int limitHand = 1;
    if (paras.Length > 1) limitHand = int.Parse(paras[1]);
    RegCatital(limitHand);

    //指标所用到的数据序列
    dataSeries = new FutureDataSeries(instrument, DataPeriodType.Minute, 1);
    RegFutureDataSeries(dataSeries);

    ma5 = new MA(dataSeries, 5);
    ma20 = new MA(dataSeries, 20);
    }
    /// <summary>
    /// 初始化函数
    /// </summary>
    public override void Init()
    {
    //设置平仓时间
    exitingTime = gTradeDate.AddHours(14).AddMinutes(58);
    //设置移动止损金额,30元
    SetTraillingStopAmount(30);
    //设置止损跳数,5跳
    SetStopLoss(5);
    }

    protected override void OnTickData(FutureTickDataBag tick)
    {
    if (dataSeries.IsNewKLine)
    {
    if (ma5.Last > ma20.Last)//金叉
    {
    CloseShortForce();
    OpenLong();
    }
    else//死叉
    {
    CloseLongForce();
    OpenShort();
    }
    }
    //尾盘平仓
    if (tick.UpdateTime > exitingTime)
    {
    CloseAllForce();
    }
    }
    }
     
  13. 到目前为止,我学到的这方面的最重要经验可能是:

    策略和代码最好是分开的

    等到策略够健壮,够聪明,够多,够突破常规的时候,
    那些“框架”,“库”,“类”,“模块”根本装不下这些东西。;)

    如果更换策略的时候需要改动一行程序,需要重新编译一次,
    那就还在那个框框里面。

    自动化交易需要一个引擎::D
    [​IMG]
     
  14. NND,怎么贴了个小日本的,:confused:
    贴个Porsche 911的吧

    [​IMG]
     
  15. 高速并行的存储,可是程序一开始都是调入到内存的,也就启动快,但是内存错误和断电死机等都会造成损失。
     
  16. 一般不这么干,这么干需要重新设计编译框架,操作风险太大,最好是有一个可扩展的,随进行就搞了。:D
     
  17. 可能是你误解了espresso的意思?!或者espresso表达错了?!

     
  18. espresso兄的意思是把代码库和策略严格独立,甚至搞成分布的库木?
    经常作非简单修改策略直接编译就可用,而是当复杂策略的时候需要重构策略代码?
     
  19. 机房里面的服务器一般不能断电,
    死机这种事极少,即使是XP这种桌面系统,只要配置得好,没有乱七八糟的软件,也不怎么会死机,除非硬件故障,
    但是操作系统,应用程序出错,内存出错还是有可能遇到的,
    好的系统应该可以从关键点恢复。
     
  20. 机器速度不够,买Nvidia tesla工作站玩并行计算。
    程序运行效率低,用C++。
    操作系统不稳定,换Linux。
    嫌硬盘慢,请用SSD硬盘。
    您又觉的硬盘太小,上RAID磁盘阵列。
    网速慢,申请光纤专线接入。
    怕断电, 配个UPS电源不就得了。
    内存错误的话,你买服务器用的那种ECC(错误检查和纠正)内存呀。
    还有什么问题,海洋上留言,小弟帮你出主意 :D