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# 先~