用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服务器开启后,就可以挂条件单了。