CTP_API的条件单

用CTP的条件单,很实用,开盘抢单一般是第一批成交的。

具体源代码:

using CTP;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using 五周行.Enums;
using 五周行.Model;

namespace 五周行.Trade
{

/// <summary>
/// ctp条件单
/// </summary>
public class OrderHandle_condition
{
    public string CtpCondition(Condition c)
    {
        Quote quote = Main.b1.allTradeQuotes.FirstOrDefault(m => m.SubjectID == c.标的);
        if (quote == null)
            return "quote=null";
        if (Main.t1==null)
        {
            return "Main.t1=null";
        }
        Main.conBLL.Hit_ctp(quote);
        //new WqrnPriceBLL().Hit_ctp(c, quote);
        List<ThostFtdcInputOrderField> alls = new List<ThostFtdcInputOrderField>();
        EnumDirectionType direction = c.方向 == 交易方向.多 ? EnumDirectionType.Buy : EnumDirectionType.Sell;
        if (c.开平 == 开平类型.开仓)
        {
            ThostFtdcInputOrderField f = Pack2(quote, direction, c.数量, c.价格);
            f.CombOffsetFlag_0 = EnumOffsetFlagType.Open;
            alls.Add(f);
        }
        else
        {
            List<InvestorPosition> temps = Main.inBLL.diccs[quote.SubjectID];
            //List<InvestorPosition> temps = Main.ccs.Where(m => m.标的 == quote.SubjectID).ToList();
            if (temps.Count == 0)
                return "没有仓位!";
            int co = temps.GroupBy(m => m.方向).Count();
            if (co > 1)
                return "有二种持仓,无法判断!";
            temps = temps.OrderBy(m => m.平仓类型).ToList();
            alls = 平仓(quote, c.价格, c.数量, direction, temps);

            if (c.开平 == 开平类型.反手)
            {
                ThostFtdcInputOrderField f = Pack2(quote, direction, c.数量, c.价格);
                f.CombOffsetFlag_0 = EnumOffsetFlagType.Open;
                alls.Add(f);
            }

        }

        Main.t1.OrderInsert(alls);

        return "";
    }

    List<ThostFtdcInputOrderField> 平仓(Quote quote, decimal priec, int n, EnumDirectionType direction, List<InvestorPosition> temps)
    {
        List<ThostFtdcInputOrderField> alls = new List<ThostFtdcInputOrderField>();
        if (temps.Count == 1)
        {
            int nu = n <= temps[0].总仓 ? n : temps[0].总仓;
            ThostFtdcInputOrderField f1 = Pack2(quote, direction, nu, priec);
            f1.CombOffsetFlag_0 = Get平仓类型(temps[0].平仓类型);
            alls.Add(f1);
        }
        else
        {
            if (n <= temps[0].总仓)
            {
                ThostFtdcInputOrderField f1 = Pack2(quote, direction, n, priec);
                f1.CombOffsetFlag_0 = Get平仓类型(temps[0].平仓类型);
                alls.Add(f1);

            }
            else
            {
                ThostFtdcInputOrderField f1 = Pack2(quote, direction, temps[0].总仓, priec);
                f1.CombOffsetFlag_0 = Get平仓类型(temps[0].平仓类型);
                alls.Add(f1);
                int w = n - temps[0].总仓;

                int q = w <= temps[1].总仓 ? w : temps[1].总仓;
                f1 = Pack2(quote, direction, q, priec);
                f1.CombOffsetFlag_0 = Get平仓类型(temps[0].平仓类型);
                alls.Add(f1);
            }
        }
        return alls;

    }

    EnumOffsetFlagType Get平仓类型(平仓类型 p)
    {
        EnumOffsetFlagType enumOffsetFlagType = EnumOffsetFlagType.Close;
        if (p == 平仓类型.平仓)
            enumOffsetFlagType = EnumOffsetFlagType.Close;
        else if (p == 平仓类型.平昨仓)
            enumOffsetFlagType = EnumOffsetFlagType.CloseYesterday;
        else if (p == 平仓类型.平今仓)
            enumOffsetFlagType = EnumOffsetFlagType.CloseToday;
        return enumOffsetFlagType;

    }

    /// <summary>
    /// 条件
    /// </summary>
    /// <param name="quote"></param>
    /// <param name="direction"></param>
    /// <param name="nums"></param>
    /// <param name="de"></param>
    /// <returns></returns>
    ThostFtdcInputOrderField Pack2(Quote quote, EnumDirectionType direction, int nums, decimal de)
    {
        ThostFtdcInputOrderField f = new ThostFtdcInputOrderField();
        f.Direction = direction;
        f.ExchangeID = quote.goods.ExchangeNo.ToString();
        f.InstrumentID = quote.SubjectID;
        f.CombHedgeFlag_0 = EnumHedgeFlagType.Speculation;//投机
        f.VolumeCondition = EnumVolumeConditionType.AV;//任意数量
        f.TimeCondition = EnumTimeConditionType.GFD;//当日有效
        f.VolumeTotalOriginal = nums;
        f.ForceCloseReason = EnumForceCloseReasonType.NotForceClose;//非强平
        f.StopPrice = (double)de;
        //f.LimitPrice = f.StopPrice;
        if (direction == EnumDirectionType.Buy)
        {
            f.ContingentCondition = EnumContingentConditionType.LastPriceLesserEqualStopPrice;//最新价小于等于条件价
            f.OrderPriceType = EnumOrderPriceTypeType.AskPrice1;//卖一价
        }
        else
        {
            f.ContingentCondition = EnumContingentConditionType.LastPriceGreaterEqualStopPrice;//最新价大于等于条件价
            f.OrderPriceType = EnumOrderPriceTypeType.BidPrice1;//卖一价
        }
        return f;
    }
}

}

预埋单其实和条件单是一样的,但不如条件单灵活。

CTP的条件单可以用来做开盘抢货用,开盘抢单都是成交时间:21:00:00。

这个条件单原理是:单子挂在ctp服务器上的,一旦触发条件,直接转成正常单子成交,所以说它是最快的,也是第一时间成交的。

盘前CTP服务器开启后,就可以挂条件单了。



   微信关注公众号:



   点击获取QQ、微信群聊