Today's the day

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

暂时告别 .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# 先~