共享一个钓鱼策略

Discussion in '红璟程序化交易平台' started by terryep, Mar 17, 2014.

  1. //红璟程序化交易平台
    //网站: http://www.programtrade.com.cn
    //QQ群:289246060
    //邮件:hj_support@163.com
    //最新帮助地址:http://www.programtrade.com.cn/webhelp/index.html

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using DevelopLibrary.Enums;
    using DevelopLibrary.DevelopAPI;

    namespace DemoStrategy.策略范例
    {
    public class 钓鱼 : EventStrategyBase
    {

    [Parameter(Display = "钓线长度", Description = "与当前价的间隔", Category = "参数")]
    int distance = 15;
    [Parameter(Display = "手数", Description = "下单的手数", Category = "参数")]
    int Qty = 1;
    [Parameter(Display = "撤单价位", Description = "当价格波动大于Adjust时撤单,重新开仓", Category = "参数")]
    int Adjust = 5;
    [Parameter(Display = "最大可撤单次数", Description = "用于限制不超过交易所的当天最大撤单手数", Category = "参数")]
    int Cancel = 400;


    double price = 0;
    double askprice = 0;
    double bidprice = 0;
    public override void OnStart()//在策略启动时执行,一般用来创建图表,或读取账户信息。
    {
    CreateChart();
    }
    public override void OnTick() //在每个tick来的时候执行
    {
    if (price == 0)
    {
    price = C.LAST;
    //同时放买卖方向的钓线
    askprice = ASKPRICE(1).LAST - distance;
    OpenBuy(askprice, Qty);
    bidprice = BIDPRICE(1).LAST + distance;
    OpenSell(bidprice, Qty);
    }
    else if (Math.Abs(price - C.LAST) >= Adjust)
    {
    price = C.LAST;
    List<Order> lst = GetOrderList(SYMBOL, EnumOrderStatusType.NoTradeQueueing);
    for (int i = 0; i < lst.Count; i++)
    {
    CancelOrder(lst);
    Cancel--;
    }
    }
    }

    public override void OnTrade(Trade trade)
    {
    if (trade.OffsetFlag == EnumOffsetFlagType.Open)
    {
    if (trade.Direction == EnumDirectionType.Buy)
    {
    if (INSTRUMENT.ExchangeID == EnumExchange.SHFE)
    CloseSellToday(BIDPRICE(1).LAST, trade.Volume);
    else
    CloseSell(BIDPRICE(1).LAST, trade.Volume);
    }
    else
    {
    if (INSTRUMENT.ExchangeID == EnumExchange.SHFE)
    CloseBuyToday(ASKPRICE(1).LAST, trade.Volume);
    else
    CloseBuy(ASKPRICE(1).LAST, trade.Volume);
    }
    }
    }

    public override void OnStop()
    {
    List<Order> lst = GetOrderList(SYMBOL, EnumOrderStatusType.NoTradeQueueing);
    for (int i = 0; i < lst.Count; i++)
    {
    CancelOrder(lst);
    }
    }

    public override void OnCancelOrderSucceeded(Order order)
    {
    if (Cancel > 0)
    {
    if (order.OrderDirection == EnumDirectionType.Buy)
    {
    askprice = ASKPRICE(1).LAST - distance;
    OpenBuy(askprice, Qty);
    }
    else
    {
    bidprice = BIDPRICE(1).LAST + distance;
    OpenSell(bidprice, Qty);
    }
    }
    }

    }
    }