Today's the day

向软件大牛炫耀我会焊单片机,向硬件大牛炫耀我会写 Rails,向软硬件大牛炫耀我生物,向软硬件生物大牛炫耀我会折腾期货 -_-bbb

C# 已经成为自动交易的标准了?

交易一直在用的 Multicharts 用的语言是内置的 EasyLanguage。昨天这个软件发布了 .net 的版本,也就是 Multicharts .NET,和前者的区别在于可以使用 C# 作为策略和指标的编写语言了。

稍微查了查,发现几个比较有名的自动交易软件(比如 Ninja Trader、SmartQuanter)都是支持 C# 的,估计 Multicharts 也是被逼的吧 XD。难道 C# 已经成为自动交易的标准了吗?

一开始我以为只是语法仿照 C#,试用了一下发现是原生的 C# 程序(或者说库),编译后直接运行在 .net framwork 上的,这样的就有些优势:

  • 可以直接调用 .net 库,也可以调用第三方库,基本上现在可以在交易程序里面干任何事情了。
  • 可以直接用 Visual Studio 来编辑和 debug 代码。
  • 可以直接调用 GDI 来高效率绘图。

而 EasyLanguage 只可以在程序里发交易单和数值计算而已,也没法获得账户的详细的信息。

也就是说 C# 版本相当于提供了更底层的操作,所以如果你觉得 EasyLanguage 的功能太少,又不想自己去翻 broker 的 API 文档从头写程序的话,那么这个 .net 版本是非常不错的选择。

虽然我目前的策略都很简单,EasyLanguage 完全可以胜任,不过我还是很有兴趣用这个 .net 版本弄个类似 “如果开仓了就在 Twitter 上 @ 我一下”  的功能,肯定非常有趣呐~

 

当然用 C# 做更底层的操作,也是有代价的,那就是代码的复杂度上升了。

比如,突破前 n 日高点买一手,用 EasyLanguage 编写的话就是这样:

input: Price( High ), Length( 20 ) ;

Buy 1 share next bar at Highest( Price, Length ) + 1 point stop;

相信即使是不懂 EasyLanguage 的人,也能大致看懂这个代码是什么意思吧~

但是如果用 C#,看起来就像这样:

using System;
using PowerLanguage.Function;

namespace PowerLanguage.Strategy
{
    public class Channel_Breakout_LE : SignalObject
    {
        private ISeries<Double> m_price;

        private int m_length = 20;

        private HighestFC m_highestfc;

        private IOrderPriced m_Order;

        public Channel_Breakout_LE(object ctx) :
            base(ctx) {}

        private ISeries<Double> price{
            get { return m_price; }
        }

        [Input]
        public int length{
            get { return m_length; }
            set { m_length = value; }
        }

        protected override void Create(){
            m_highestfc = new HighestFC(this);
            m_Order = OrderCreator.Stop(new SOrderParameters(Contracts.Default, "ChBrkLE", EOrderAction.Buy));
        }

        protected override void StartCalc(){
            m_price = Bars.High;
            m_highestfc.pricevalue = price;
            m_highestfc.len = new Lambda<Int32>(delegate { return length; });
        }


        protected override void CalcBar(){
            m_Order.Send((m_highestfc[0]
                               + (1*Bars.Point)));
        }
    }
}

……囧

如果说 EasyLanguage 即使是不懂程序的人也可以看两天就上手的话,那么这个 C# 版本的肯定只能是程序员的菜了。

好歹前两年也写过几个 .net 的程序,翻出书复习一下 C# 先~