Today's the day

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

从 EasyLanguage 迁移到 MC .NET (一):基本结构
从 EasyLanguage 迁移到 MC .NET (三):常用 EasyLanguage 函数写法

从 EasyLanguage 迁移到 MC .NET (二):发送订单

galeki posted @ 2012年9月04日 22:34 in 交易 with tags MC-NET , 3858 阅读

发送订单

在 MC .NET 中,发送买卖的订单要比 EL 中麻烦很多,最主要的区别在于,要事先为策略中所有可能会用到的订单建立订单对象,不同类型的订单(例如 Limit、Stop、Market)在创建订单对象的时候要指定不同的参数。

开仓

发送开仓订单在 EL 中的写法是这样的:

Buy next bar at 1200.5 limit;  // Limit Order
Buy next bar at 1234.5 stop;   // Stop Order
Buy next bar at market;        // Market Order

在 MC .NET 中就要麻烦一些,步骤如下:

  1. 首先为这个订单声明一个 IOrderPriced(如果是 market 单就是 IOrderMarket) 变量。
  2. 在 Create 函数中,为这个订单创建实例。
  3. 在 CalcBar 函数中发送订单。
namespace PowerLanguage.Strategy {
    public class test2 : SignalObject {
        public test2(object _ctx):base(_ctx){}
        
        private IOrderPriced buy_limit_order;  // Limit Order
        private IOrderPriced buy_stop_order;   // Stop Order
        private IOrderMarket buy_market_order; // Market Order
        

        protected override void StartCalc() {
            
        }
        protected override void CalcBar(){
            // ...
            buy_limit_order.Send(1200.5);
            buy_stop_order.Send(1234.5);
            buy_market_order.Send();
            // ...
        }
    }
}

平仓

平仓单在 EL 中的写法是这样的:

sell next bar at market;
buytocover next bar at market;

在 MC .NET 中,平仓单和上面的开仓单的写法完全一样,区别只在于在 Create 函数中,把参数设置为 EOrderAction.Sell 或 EOrderAction.BuyToCover:

...
        protected override void Create() {
            // ...
            sell_order =         OrderCreator.MarketNextBar(new SOrderParameters(Contracts.Default, EOrderAction.Sell));
            buytocover_order =   OrderCreator.MarketNextBar(new SOrderParameters(Contracts.Default, EOrderAction.BuyToCover));
        }
...

Limit 和 Stop 的平仓单同理。

指定手数

上面的例子并没有设置买卖的手数,所以默认买卖的手数为策略设置中的默认值,如果想要指定手数要怎么写呢?

在 EL 中,指定手数(比如买 5 手)的写法如下:

Buy 5 shares next bar at 1234.5 stop;

在 MC .NET 中要:

  1. 在 Create 函数中创建订单对象时,第一个参数要设置为 Contracts.UserSpecified,这样才可以指定手数。
  2. 在发送订单的 Send 函数中指定具体的手数。
...
	protected override void Create() {
		// ...
		buy_stop_order =   OrderCreator.Stop(new SOrderParameters(Contracts.UserSpecified, EOrderAction.Buy))

	}
...

	protected override void CalcBar(){
		// ...

		buy_stop_order.Send(1234.5, 5);

		// ...
	}

 

  • 无匹配

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter