Esempio n. 1
0
void CTraderSpi::OnRspQryInvestorPosition(CThostFtdcInvestorPositionField *pInvestorPosition, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
{
	std::cout << "--->>> " << "OnRspQryInvestorPosition" << std::endl;
	if (bIsLast && !IsErrorRspInfo(pRspInfo))
	{
		///报单录入请求
		ReqOrderInsert();
	}
}
Esempio n. 2
0
void CtpTradeSpi::ForceClose(){
	TThostFtdcInstrumentIDType    instId;//合约
	TThostFtdcDirectionType       dir;//方向,'0'买,'1'卖
	TThostFtdcCombOffsetFlagType  kpp;//开平,"0"开,"1"平,"3"平今
	TThostFtdcPriceType           price;//价格,0是市价,上期所不支持
	TThostFtdcVolumeType          vol;//数量

	for (auto item : AP::GetManager().getAllPositionMap()){
		//平多
		if (item.second.Holding_long > 0)
		{
			STRCPY(instId, item.second.InstId.c_str());
			dir = THOST_FTDC_D_Sell;// #define THOST_FTDC_D_Buy '0' ||| #define THOST_FTDC_D_Sell '1'
			price = item.second.LastPrice - 5 * AP::GetManager().getInstrumentField(instId).PriceTick;

			//上期所
			if (strcmp(AP::GetManager().getInstrumentField(instId).ExchangeID, "SHFE") == 0)
			{
				if (item.second.YdPosition_long == 0)//没有昨仓
				{
					SYNC_PRINT << "[Trade] 多单上期所 全部平今";;

					STRCPY(kpp, "3");//平今
					vol = item.second.Holding_long;
					ReqOrderInsert(Order(item.second.InstId, price, vol, dir, kpp));

				}
				else if (item.second.TodayPosition_long == 0)//没有今仓
				{
					SYNC_PRINT << "[Trade] 多单上期所 全部平昨";

					STRCPY(kpp, "1");//平仓
					vol = item.second.Holding_long;
					ReqOrderInsert(Order(item.second.InstId, price, vol, dir, kpp));

				}
				//同时持有昨仓和今仓
				else if (item.second.YdPosition_long > 0 && item.second.TodayPosition_long > 0)
				{
					SYNC_PRINT << "[Trade] 多单上期所同时 平今平昨";

					STRCPY(kpp, "3");//平今
					vol = item.second.TodayPosition_long;
					ReqOrderInsert(Order(item.second.InstId, price, vol, dir, kpp));

					STRCPY(kpp, "1");//平仓
					vol = item.second.YdPosition_long;
					ReqOrderInsert(Order(item.second.InstId, price, vol, dir, kpp));

				}

			}
			//非上期所
			else
			{
				SYNC_PRINT << "[Trade] 非上期所多单 平仓[不支持平今]";

				STRCPY(kpp, "1");
				vol = item.second.Holding_long;
				ReqOrderInsert(Order(item.second.InstId, price, vol, dir, kpp));

			}
		}

		//平空
		if (item.second.Holding_short > 0)
		{
			STRCPY(instId, item.second.InstId.c_str());//或strcpy(instId, iter->first.c_str());
			dir = '0';
			price = item.second.LastPrice + 5 * AP::GetManager().getInstrumentField(instId).PriceTick;

			//上期所
			if (strcmp(AP::GetManager().getInstrumentField(instId).ExchangeID, "SHFE") == 0)
			{
				if (item.second.YdPosition_short == 0)//没有昨仓
				{
					SYNC_PRINT << "[Trade] 空单上期所 全部平今";

					STRCPY(kpp, "3");//平今
					vol = item.second.Holding_short;
					ReqOrderInsert(Order(item.second.InstId, price, vol, dir, kpp));

				}
				else if (item.second.TodayPosition_short == 0)//没有今仓
				{
					SYNC_PRINT << "[Trade] 空单上期所 全部平昨";

					STRCPY(kpp, "1");//平仓
					vol = item.second.Holding_short;
					ReqOrderInsert(Order(item.second.InstId, price, vol, dir, kpp));

				}
				//同时持有昨仓和今仓
				else if (item.second.YdPosition_short > 0 && item.second.TodayPosition_short > 0)
				{
					SYNC_PRINT << "[Trade] 空单上期所 同时平今平昨";

					STRCPY(kpp, "3");//平今
					vol = item.second.TodayPosition_short;
					ReqOrderInsert(Order(item.second.InstId, price, vol, dir, kpp));

					STRCPY(kpp, "1");//平仓
					vol = item.second.YdPosition_short;
					ReqOrderInsert(Order(item.second.InstId, price, vol, dir, kpp));

				}
			}
			//非上期所
			else
			{
				SYNC_PRINT << "[Trade] 非上期所空单 平仓[不支持平今]";

				STRCPY(kpp, "1");
				vol = item.second.Holding_short;
				ReqOrderInsert(Order(item.second.InstId, price, vol, dir, kpp));

			}
		}
	}
}