暂时告别 .net 版的 Multicharts
去年 Multicharts 发布了 .net 版,第一时间就买了 License,本想给交易程序弄点好玩的功能,但是到最后还是没有时间搞,还是老样子用 Easylanguage 版本继续跑。
当初买 .net 版的原因还有一个,就是因为 Multicharts 的 License 只能同时运行一个,而我的自动交易又是放在 VPS 上的,这样如果在交易日我有什么想法想在本地测试一下,就非常麻烦。所以当时的想法就是,趁着 .net 版的发布,买一个专门用来本地测试。
结果这几个月最大的感受,就是 C# 实在是不适合拿来测试自己的想法,原因就是 ---- 写起来太累了。
再次粘贴一下同一个程序 Easylanguage 和 C# 版本的对比:
Easylanguage:
input: Price( High ), Length( 20 ) ; Buy 1 share next bar at Highest( Price, Length ) + 1 point stop;
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))); } } }
每次有个想法开始着手写 C# 版本的代码,等我把那些对象啊类啊初始化好,我都已经忘了想法是什么了……
想画一条线还得去新建个对象,然后初始化才能用,好麻烦啊。
再加上有些实用的 Easylanguage 函数并没有移植过来,还得自己重新写。
再加上因为代码增多造成的各种 bug,比如类型转换错误呐,声明错误呐……
总之用 C# 测试自己的想法就是个杯具。
于是只好用回 Easylanguage 版,但是又不想再去买第二个 License,也不放心用 .net 版去自动交易,所以一段时间以来测试都留在非交易日的周末去做,不过最近周末总是不在家,测试工作也就越来越懈怠。
上个周末反省了一下觉得这样不行,最后还是下定决心再买个 License,先去官方查了查购买第二个 License 有没有优惠政策,结果看到了这个:
真是相见恨晚,于是就这样把 .net 的 License 给转到 Easylanguage,这样问题就解决了,不过也就暂时跟 .net 版告别了,以后有时间再去做好玩的东西吧~
话说本文并不是黑 .net 版本的 Multicharts 哦,用起来还是很不错的,如果某一天需要用到一些底层功能或是第三方库,还是非 .net 莫属,只不过不适合拿来测试自己的想法而已。
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# 先~