CTP使用

2023-10-27

1. CTP介绍

1.1 CTP简介

综合交易平台CTP(Comprehensive Transaction Platform)是由上海期货信息技术有限公司(上海期货交易所的全资子公司)开发的期货交易平台,CTP平台以“新一代交易所系统”的核心技术为基础,构建了稳定、高速、开放式的接口,适合程序化交易软件运用和短线炒单客户使用。投资者可直接用CTP的API开发交易程序,连到期货公司的CTP系统交易。

1.2 使用前的准备

1.2.1 登录信息

想要在客户端调用API接入CTP柜台进行程序化交易,需要以下基本信息才能登录(使用行情API只需要IP地址信息,其他均可为空):

  • TradeFront / MarketFront:前者是CTP系统的交易前置IP地址,用来下单撤单等;后者是行情前置IP地址,用来订阅接收行情
  • BrokerID:经纪商代码,指期货公司在CTP系统上的编码,四位数。如海通期货是8000
  • AppID:客户终端软件代码
  • AuthCode:客户终端软件认证码
  • InvestorID(UserID,InvestUnitID):投资者代码,指客户在CTP系统上的唯一ID,在期货公司开户后由期货公司分配得到。UserID是操作员代码,InvestUnitID是投资单元代码,普通投资者直接填InvestorID即可
  • Password:开户时设置的密码,需要注意的是开户完首次登录CTP系统需要修改密码

1.2.2 simnow模拟交易

没有期货账户的用户可以在simnow平台【白天才能上】进行模拟开户,其中InvestorID和Password在官网注册后获得,其他登录需要的信息如下:

  • IP地址第一组(交易时段):Trade Front:180.168.146.187:10201,Market Front:180.168.146.187:10211
    IP地址第二组(交易时段):Trade Front:180.168.146.187:10202,Market Front:180.168.146.187:10212
    IP地址第三组(交易时段):Trade Front:218.202.237.33:10203,Market Front:218.202.237.33:10213
    IP地址(非交易时段):Trade Front:180.168.146.187:10130,Market Front:180.168.146.187:10131
  • BrokerID:9999
  • APPID:simnow_client_test
  • AuthCode:0000000000000000

1.3 API介绍

1.3.1 API文件

Windows版本的API有8个文件,作用分别为:

  • ThostFtdcUserApiDataType.h:定义业务数据类型,用typedef为现有类型创建同义字
  • ThostFtdcUserApiStruct.h:使用上一个API文件中的数据类型定义业务数据结构,调用api时需要传入这些数据结构
  • ThostFtdcMdApi.hthostmduserapi_se.libthostmduserapi_se.dll:用于获取行情的API,md表示market data
  • ThostFtdcTraderApi.hthosttraderapi_se.libthosttraderapi_se.dll:用于交易操作的API

1.3.2 API内容

  • 行情API和交易API的文件中各有两个类,xxxSpi和xxxApi,分别代表着回调和调用,每个Api都有一个与之绑定的Spi
  • 每个Api函数对应固定的请求,在客户端主动调用,交易所会根据收到的请求回调与之对应的Spi函数
  • 每个Spi函数对应固定的响应,在客户端需要进行重写,回调函数中的参数携带了交易所返回的信息

2. 基本使用

2.1 行情API使用

在主函数中创建行情API对象,并为其注册MdSpi对象,连接到行情IP地址后登录,登录完成后即可订阅行情(代码中只展示了部分.cpp文件的内容)。

// main.cpp
int main(int argc, char* argv[]) {
	CThostFtdcMdApi* mdapi = CThostFtdcMdApi::CreateFtdcMdApi("./md_file/");
	MdSpi* mdspi = new MdSpi(mdapi);
	mdapi->RegisterSpi(mdspi);
	mdapi->RegisterFront("tcp://180.168.146.187:10131");
	mdapi->Init();
	mdapi->Join();
	return 0;
}

//MdSpi.cpp
void MdSpi::OnFrontConnected() {
	cout << "=========已连接上,请求登录==========" << endl;
	loginField = new CThostFtdcReqUserLoginField();
	strcpy(loginField->BrokerID, BROKER_ID.c_str());
	strcpy(loginField->UserID, NULL_STR.c_str());
	strcpy(loginField->Password, NULL_STR.c_str());
	mdapi->ReqUserLogin(loginField, loginRequestID++);
}

void MdSpi::OnRspUserLogin(CThostFtdcRspUserLoginField* pRspUserLogin, CThostFtdcRspInfoField* pRspInfo,int nRequestID, bool bIsLast) {
	cout << "==============登录请求响应===============" << endl;
	if (pRspInfo != nullptr || pRspInfo->ErrorID == 0) {
		cout << "登陆成功!!!" << endl;
		cout << "交易日:" << pRspUserLogin->TradingDay << endl;
		cout << "登陆成功时间:" << pRspUserLogin->LoginTime << endl;
		cout << "经纪公司代码:" << pRspUserLogin->BrokerID << endl;
		cout << "用户代码:" << pRspUserLogin->UserID << endl;
		//订阅行情
		char* instrumentID[] = { "au2110" };	//订阅一个合约所以数量为1
		mdapi->SubscribeMarketData(instrumentID, 1);
	}
}

void MdSpi::OnRtnDepthMarketData(CThostFtdcDepthMarketDataField* pDepthMarketData) {
	cout << "==============深度行情通知==============" << endl;
	//cout << " 交易日:" << pDepthMarketData->TradingDay << endl;
	//cout << "合约代码:" << pDepthMarketData->InstrumentID << endl;
	//cout << "最新价:" << pDepthMarketData->LastPrice << endl;
	//cout << "最后修改时间" << pDepthMarketData->UpdateTime << endl;
	//cout << "最后修改毫秒" << pDepthMarketData->UpdateMillisec << endl;
	//cout << "申买价一:" << pDepthMarketData->BidPrice1 << endl;
	//cout << "申买量一:" << pDepthMarketData->BidVolume1 << endl;
	//cout << "申卖价一:" << pDepthMarketData->AskPrice1 << endl;
	//cout << "申卖量一:" << pDepthMarketData->AskVolume1 << endl;
	//cout << "本次结算价格:" << pDepthMarketData->SettlementPrice << endl;
	//cout << "成交金额:" << pDepthMarketData->Turnover << endl;
	//cout << "持仓量:" << pDepthMarketData->OpenInterest << endl;
}

2.2 交易API使用

在主函数中创建交易API对象,并为其注册TdSpi对象,订阅共有流和私有流,连接到交易IP地址后,依次进行验证、登录、结算确认,完成后即可发出交易API请求(代码中只展示了部分.cpp文件的内容)。

// main.cpp
int main(int argc, char* argv[]) {
	TdApi* tdApi = new TdApi();
	while (true)
	{
		int x;
		cout << "0退出;1验证;2登录;3结算确认;4查询持仓;5查询资金;6查询报单;7查询成交;8查询手续费;9报单;10撤单" << endl;
		cout << "输入:" << endl;
		cin >> x;
		if (x == 0) break;
		else if (x == 1) tdApi->Authenticate();
		else if (x == 2) tdApi->Login();
		else if (x == 3) tdApi->Confirm();
		else if (x == 4) tdApi->QueryPosition();
		else if (x == 5) tdApi->QueryAccount();
		else if (x == 6) tdApi->QueryOrder();
		else if (x == 7) tdApi->QueryTrade();
		else if (x == 8) {
			cout << "输入合约代码:";
			string instrumentID;
			cin >> instrumentID;
			tdApi->QueryCommission(instrumentID);
		}
		else if (x == 9) {
			cout << "输入合约代码:";
			string instrumentID;
			cin >> instrumentID;
			cout << "输入报单价格:";
			double limitPrice;
			cin >> limitPrice;
			cout << "输入报单数量:";
			int volume;
			cin >> volume;
			tdApi->InsertOrder(instrumentID, limitPrice, volume);
		}
		else if (x == 10) {
			tdApi->WithdrawOrder();
		}
	}
	return 0;
}

//TdApi.cpp
TdApi::TdApi()
{
	tdapi = CThostFtdcTraderApi::CreateFtdcTraderApi("./trader_file/");
	tdspi = new TdSpi();
	tdapi->RegisterSpi(tdspi);
	tdapi->SubscribePublicTopic(THOST_TERT_RESTART);
	tdapi->SubscribePrivateTopic(THOST_TERT_RESTART);
	//tdapi->RegisterFront("tcp://218.202.237.33:10203");
	tdapi->RegisterFront("tcp://180.168.146.187:10130");
	tdapi->Init();
}

TdApi::~TdApi()
{
	tdapi->RegisterSpi(nullptr);
	tdapi->Release();
	tdapi = nullptr;
	delete tdspi;
	tdspi = nullptr;
}

int TdApi::Authenticate()
{
	CThostFtdcReqAuthenticateField* pReqAuthenticateField = new CThostFtdcReqAuthenticateField();
	strcpy(pReqAuthenticateField->BrokerID, BROKER.c_str());
	strcpy(pReqAuthenticateField->UserID, USER_ID.c_str());
	strcpy(pReqAuthenticateField->AuthCode, AUTH_CODE.c_str());
	strcpy(pReqAuthenticateField->AppID, APP_ID.c_str());
	cout << "RequestID:" << nRequestID << endl;
	return tdapi->ReqAuthenticate(pReqAuthenticateField, nRequestID++);
}

int TdApi::Login()
{
	CThostFtdcReqUserLoginField* pReqUserLoginField = new CThostFtdcReqUserLoginField();
	strcpy(pReqUserLoginField->BrokerID, BROKER.c_str());
	strcpy(pReqUserLoginField->UserID, USER_ID.c_str());
	strcpy(pReqUserLoginField->Password, PASS.c_str());
	cout << "RequestID:" << nRequestID << endl;
	return tdapi->ReqUserLogin(pReqUserLoginField, nRequestID++);
}

int TdApi::Confirm()
{
	CThostFtdcSettlementInfoConfirmField* pSettlementInfoConfirm = new CThostFtdcSettlementInfoConfirmField();
	strcpy(pSettlementInfoConfirm->BrokerID, BROKER.c_str());
	strcpy(pSettlementInfoConfirm->InvestorID, USER_ID.c_str());
	cout << "RequestID:" << nRequestID << endl;
	return tdapi->ReqSettlementInfoConfirm(pSettlementInfoConfirm, nRequestID++);
}

int TdApi::InsertOrder(string instrumentID, double limitPrice, int volume)
{
	CThostFtdcInputOrderField* pInputOrder = new CThostFtdcInputOrderField();
	strcpy_s(pInputOrder->BrokerID, BROKER.c_str());
	strcpy_s(pInputOrder->InvestorID, USER_ID.c_str());
	strcpy_s(pInputOrder->ExchangeID, "SHFE");
	strcpy_s(pInputOrder->InstrumentID, instrumentID.c_str());
	pInputOrder->OrderPriceType = THOST_FTDC_OPT_LimitPrice;//限价
	pInputOrder->Direction = THOST_FTDC_D_Buy;//买
	pInputOrder->CombOffsetFlag[0] = THOST_FTDC_OF_Open;//开
	pInputOrder->CombHedgeFlag[0] = THOST_FTDC_HF_Speculation;//投机
	pInputOrder->LimitPrice = limitPrice;
	pInputOrder->VolumeTotalOriginal = volume;
	pInputOrder->TimeCondition = THOST_FTDC_TC_GFD;///当日有效
	pInputOrder->VolumeCondition = THOST_FTDC_VC_AV;///任意数量
	pInputOrder->MinVolume = 1;
	pInputOrder->ContingentCondition = THOST_FTDC_CC_Immediately;
	pInputOrder->StopPrice = 300.0;
	pInputOrder->ForceCloseReason = THOST_FTDC_FCC_NotForceClose;
	pInputOrder->IsAutoSuspend = 0;
	pInputOrder->IsSwapOrder = 0;
	cout << "RequestID:" << nRequestID << endl;
	return tdapi->ReqOrderInsert(pInputOrder, nRequestID++);
}

2.3 API使用中的常见问题

  • 客户端程序至少由两个线程组成,一个是应用程序主线程,一个是CTP API工作线程(行情API和交易API为不同的线程),程序与交易系统的通讯是由API工作线程驱动的
  • CTP API提供的接口是线程安全的,可以有多个应用程序线程同时发出请求。SPI提供的接口回调是由API工作线程驱动,即SPI回调函数与API调用函数都在同一个线程中运行
  • 使用行情API时登录的账号密码可都为空,登录后即可使用;使用交易API时需要先验证才能登录,登录后需要进行结算确认才能下单
  • 使用行情API时需要订阅公有流和私有流。公有流用于接收公有数据,如合约在场上的交易状态。私有流用于接收私有数据,如报单回报。两种流的默认模式都是是从上次断开连接处继续收取交易所发布数据(Resume ),还可以指定全部重新获取(Restart),或从登陆后获取(Quick)
  • 交易SPI的查询回调函数中,pRspInfo==nullptr或pRspInfo->ErrorID==0都代表查询成功,如果查询记录为空在调用字段的属性时会报空指针异常
  • 报单时有些交易所只支持限价单,有效期类型只支持当日有效,若填别的无任何返回;且有些必填字段并不是必填
  • 不同交易所的合约命名规则不统一:上期所/能源所/大商所(小写+4个数字);中金所(大写+4个数字);郑商所(大写+3个数字)。合约填写的格式错误或合约不存在则无返回结果
  • 交易所代码:上期所(SHFE),大商所(DCE),郑商所(CZCE),中金所(FFEX),能源中心(INE)
  • 下单和撤单成功(仅代表报单操作成功,并不代表一定执行)都会执行OnRtnOrder回调函数,有单成交时执行OnRtnTrade回调函数
  • 有多个字段组合可以唯一确定一笔报单,推荐通过OrderSysID字段,OrderSysID是报单报入到交易所时交易所给编的唯一编号,该字段加上ExchangeID也可以用来确定唯一一笔报单
  • 每次下单可能会收到多次OnRtnOrder函数响应,其流程如下图所示,CTP风控通过引起的OnRtnOrder回调,OrderSysID字段为空,因为订单还没有到达交易所

在这里插入图片描述

3. TIP

3.1 确定报单的唯一性

  • FrontID:CTP后台前置编号
  • SessionID:本次链接编号。登录成功回报会返回上述两个字段的值,这两个编号在本次连接中保持不变
  • OrderRef:报单引用,可自定义或不填。上述三个字段可唯一确定一笔报单
  • ExchangeID:交易所代码
  • OrderSysID:报单报入到交易所时交易所给的唯一编号。上述两个字段也可唯一确定一笔报单

3.2 报单状态编号OrderStatus
报单的状态编号由交易所返回,由枚举值标识,常见状态有:

  • a:“未知”,表示CTP已收到客户端报单,正在转发至交易所,对应第一个OnRtnOrder(第二个也可能出现)
  • 3:“未成交还在队列中”,表示报单已通过交易所风险检查,对应第二个OnRtnOrder
  • 1:“部分成交还在队列中”,表示订单部分成交,对应第三个OnRtnOrder
  • 0:“全部成交”,表示订单全部成交,对应第三个OnRtnOrder
  • 5:“撤单”,主动撤单或被动撤单时OnRtnOrder返回的状态,需配合OrderSubmitStatus字段区分是否主动撤单,该字段返回3时代表主动撤单,返回4代表被动撤单

3.3 查询与交易流控

使用客户端进行CTP交易时,可能会受到【CTP底层动态库、CTP柜台系统、交易所】对查询和交易的频率限制。

3.3.1 CTP底层动态库流控

目前底层动态库中的流控只针对查询,即API中所有以ReqQry开头的函数,此处流控分为两种:

  • 未处理请求超过许可数:此时调用函数返回值为-2。这是因为目前动态库底层设置每次只允许1个查询请求在途,即当前这笔查询请求发出后,在未收到响应前,不能发起下一笔查询请求。该流控使得不能在回调函数中调用多次查询函数
  • 每秒发送请求数超过许可数:此时调用函数返回值为-3。在穿透式版本之前,CTP动态库底层设定了API每秒只允许发出1次查询请求。升级新版本后,每秒允许查询次数由后台设定,在登录回报中传给动态库。该流控是session层面的,也就是说是每个链接内的查询次数受该流控,多个链接的查询次数互不影响,所以是可以多次CreateFtdcTraderApi创建多个session来实现1秒内多次查询

3.3.2 CTP柜台系统流控

  • 请求数流控:该流控是针对单个session的所有请求(包括查询和交易)。该流控不会有错误信息或错误返回,具体设置只能询问期货公司
  • 报撤单流控:该流控指调用报单、撤单函数时每秒内允许的最大笔数,这两个函数流控是分开计算的。如果触发该流控,则会在相应的错误回调函数中返回“CTP:下单频率限制”。该流控是投资者InvestorID级别的,所以多开session也没法。如果策略高频,真触发该风控,那只能分账户来解决该问题了。不过目前该风控是分交易所和品种的,也就是说如果该值设6,那客户1秒内同时报上期所5笔,大商所5笔,是不会触发到该流控的。
  • 查询流控:查询比较耗时且占资源,所以除了在CTP底层动态库设置了流控,同样也在CTP后台设置了流控。如果触发后台的查询流控,则会回调OnRspError,并提示:“CTP:查询未就绪,请稍后重试”
  • 前置连接数流控:指在CTP中每秒允许的最大API连接请求数。如果超过该流控则会被主动断开连接,回调OnFrontDisconnected。因此用户如果发现自己的程序一连接前置就被断开,则除了版本问题外,有可能是遇到了连接数流控。该流控是针对不同前置地址的
  • 同一用户最大允许在线会话数:这是指同一个UserID在CTP中同时登录在线的最大允许session数,登录成功在线即算1个session,用其他客户端登录在线也计算在内。触发该流控则会在OnRspUserLogin回调中返回“CTP:用户在线会话超出上限”

3.3.3 交易所流控

一般是报单时可能会触发该流控,该流控是区分交易所的,有的交易所会有此流控,有的交易所没有,遇到得比较少。受到交易所流控后会触发OnRtnOrder,在StatusMsg中报“CTP:交易所每秒发送请求数超过许可数”或者“CTP:交易所未处理请求超过许可数”。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CTP使用 的相关文章

  • WinForms:如何确定窗口是否不再活动(没有子窗口具有焦点)?

    我的应用程序使用多个窗口 我想隐藏一个特定窗口 以防应用程序失去焦点 当活动窗口不是应用程序窗口时 source https stackoverflow com questions 466354 how can i tell if a wi
  • ASP.NET MVC 中的经典 ASP (C#)

    我有一个应用程序想要 最终 转换为 ASP NET MVC 我想要进行全面的服务升级 到 ASP NET 但想要使用当前的 ASP 内容来运行当前的功能 这样我就可以在对新框架进行增量升级的同时升级小部分 该站点严重依赖于不太成熟的 VB6
  • asp.net 文本框文本模式数字,仅允许数字

    我只是想知道 ASP NET 中是否有一种方法只允许文本框中的数字textmode number 当我使用这个时
  • 为什么我不能用 `= delete;` 声明纯虚函数?

    Intro 纯虚函数使用通用语法声明 virtual f 0 然而 自 c 11 以来 有一种方法可以显式地传达non existence 特殊 成员函数的 Mystruct delete eg default constructor Q
  • 为什么要序列化对象需要 Serialized 属性

    根据我的理解 SerializedAttribute 不提供编译时检查 因为它都是在运行时完成的 如果是这样 那么为什么需要将类标记为可序列化呢 难道序列化器不能尝试序列化一个对象然后失败吗 这不就是它现在所做的吗 当某些东西被标记时 它会
  • C++:重写已弃用的虚拟方法时出现弃用警告

    我有一个纯虚拟类 它有一个纯虚拟方法 应该是const 但不幸的是不是 该接口位于库中 并且该类由单独项目中的其他几个类继承 我正在尝试使用这个方法const不会破坏兼容性 至少在一段时间内 但我找不到在非常量方法重载时产生警告的方法 以下
  • Clang 编译器 (x86):80 位长双精度

    我正在尝试在 x86 Windows 平台上使用本机 80 位长双精度 海湾合作委员会选项 mlong double 80 https gcc gnu org onlinedocs gcc x86 Options html似乎不适用于 cl
  • 显示异常时的自定义错误消息:从客户端检测到潜在危险的 Request.Form 值

    我在我的 Web 应用程序中使用 ASP NET 的登录控件 当发生此异常时 我想在标签上显示一种有趣的错误类型System Web HttpRequestValidationException A potentially dangerou
  • ASP MVC:服务应该返回 IQueryable 的吗?

    你怎么认为 你的 DAO 应该返回一个 IQueryable 以便在你的控制器中使用它吗 不 您的控制器根本不应该处理任何复杂的逻辑 保持苗条身材 模型 而不是 DAO 应该将控制器返回给视图所需的所有内容 我认为在控制器类中看到查询 甚至
  • 如何识别 WPF 文本框中的 ValidationError 工具提示位置

    我添加了一个箭头来指示工具提示中的文本框 当文本框远离屏幕边缘时 这非常有效 但是当它靠近屏幕边缘时 工具提示位置发生变化 箭头显示在左侧 Here is the Image Correct as expected since TextBo
  • C 语言中 =+(等于加)是什么意思?

    我碰到 与标准相反 今天在一些 C 代码中 我不太确定这里发生了什么 我在文档中也找不到它 In ancientC 版本 相当于 它的残余物与最早的恐龙骨头一起被发现 例如 B 引入了广义赋值运算符 使用x y to add y to x
  • 无法将类型“System.IO.Stream”隐式转换为“Java.IO.InputStream”

    我提到了一些类似的问题 但没有一个涉及IO 当我使用时 我在java中使用了相同的代码Eclipse 那次就成功了 但现在我尝试在中使用这段代码Mono for Android C 它不起作用 我正在尝试运行此代码来创建一个InputStr
  • 如何重置捕获像素的值

    我正在尝试创建一个 C 函数 该函数返回屏幕截图位图中每四个像素的 R G 和 B 值 这是我的代码的一部分 for int ix 4 ix lt 1366 ix ix 4 x x 4 for int iy 3 iy lt 768 iy i
  • 为什么我不应该对不是由 malloc() 分配的变量调用 free() ?

    我在某处读到 使用它是灾难性的free删除不是通过调用创建的对象malloc 这是真的 为什么 这是未定义的行为 永远不要尝试它 让我们看看当您尝试时会发生什么free 自动变量 堆管理器必须推断出如何获取内存块的所有权 为此 它要么必须使
  • 获取 2 个数据集 c# 中的差异

    我正在编写一个简短的算法 它必须比较两个数据集 以便可以进一步处理两者之间的差异 我尝试通过合并这两个数据集并将结果更改放入新的数据集来实现此目标 我的方法如下所示 private DataSet ComputateDiff DataSet
  • System.Runtime.InteropServices.COMException(0x80040154):[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我在 C 项目中遇到异常 System Runtime InteropServices COMException 0x80040154 检
  • 耐用功能是否适合大量活动?

    我有一个场景 需要计算 500k 活动 都是小算盘 由于限制 我只能同时计算 30 个 想象一下下面的简单示例 FunctionName Crawl public static async Task
  • 双精度类型二维多维数组的 pinvoke 编组作为 c# 和 c++ 之间的输入和输出

    我有以下我正在尝试解决的双物质类型的 2d 多维数组的 c 和 c pinvoke 编组 我已经查看了以下热门内容以获得我目前拥有的内容使用双精度数组进行 P Invoke 在 C 和 C 之间编组数据 https stackoverflo
  • 用于 C# XNA 的 Javascript(或类似)游戏脚本

    最近我准备用 XNA C 开发另一个游戏 上次我在 XNA C 中开发游戏时 遇到了必须向游戏中添加地图和可自定义数据的问题 每次我想添加新内容或更改游戏角色的某些值或其他内容时 我都必须重建整个游戏或其他内容 这可能需要相当长的时间 有没
  • 是否可以在 C# 中强制接口实现为虚拟?

    我今天遇到了一个问题 试图重写尚未声明为虚拟的接口方法的实现 在这种情况下 我无法更改接口或基本实现 而必须尝试其他方法 但我想知道是否有一种方法可以强制类使用虚拟方法实现接口 Example interface IBuilder

随机推荐

  • npm包 指定对应的包从私人仓库下载

    创建 npmrc strict peer dependencies false registry https registry npmjs org 自定义包名 registry http npm 私人仓库名字 com 自定义包名2 regi
  • DID模型

    政策评估 Policy Evaluation 是当前公共经济学和劳动经济学中最常用的实证方法 其目的在于评价一项既有政策的效果 此类研究关注的是该政策的处理效应 Treatment Effect 由于政策往往是对一类特定的人群起作用 政策评
  • mysql引擎层和server层交互_MySQL的server层和存储引擎层是如何交互的

    SQL的全称是Structured Query Language 翻译成中国话就是结构化查询语言 这是一种声明式的语法 何为声明式 可以联想一下我们生活中的老板 老板在布置任务的时候会告诉你 小王啊 今天把这些砖从A地搬到B地啊 然后就没然
  • Android EditText筛选+选择功能开发

    在日常开发中经常会遇到这种需求 EditText既需要可以筛选 又可以点击选择 这里筛选功能用的是AutoCompleteTextView 选择功能使用的是第三方库https github com kongzue DialogX Andro
  • SQL-labs的第17关——报错注入(updatexml)

    这一关的网站是用来修改密码的 所以数据库会执行update这种查询方式 而不是select这种查询方式 我们发现用户名这一框输入数据不行 会进行过滤 所以我们这次在密码这一框中进行注入 1 判断闭合方式 输入语句1 页面没报错 输入1 时报
  • php解析udp数据,python中UDP套接字通信的简单解析(附代码)

    本篇文章给大家带来的内容是关于python中UDP套接字通信的简单解析 附代码 有一定的参考价值 有需要的朋友可以参考一下 希望对你有所帮助 UDPserver pyimport socket 导入套接字模块 s socket socket
  • Kafka+Confluent+ES在Centos7上的搭建1

    系统环境 Centos7 JDK8 kafka 2 12 2 1 0 使用其中的自带zookeeper confluent oss 4 0 0 2 11 elasticsearch 6 5 4 KafkaOffsetMonitor asse
  • 京东店铺所有商品API接口(JD整店商品查询API接口)

    可以通过京东店铺所有商品API接口采集店铺所有商品详情页各项数据 包含商品标题 SKU信息 价格 优惠价 收藏数 销量 SKU图 标题 详情页图片等店铺内页面上有的数据均可以拿到 大家都知道 京东的反爬虫机制十分严 而很多时候 没办法高效的
  • 一个99%的人都说不清楚知识点——Spring 事务传播行为

    面试过很多人 大部分都能把事务的四个特性及隔离级别说得七七八八 但当问到 Spring 的传播行为时 就基本上没人能说出个一二三了 我们都知道 一个事务要么成功 要么失败 但当若干个事务配合完成一个复杂任务时 就不能简单的这样一刀切了 我们
  • vim快速跳转快捷键

    快捷键 描述 跳转到括号匹配处 gD 跳转到局部变量的定义处 跳转到光标上次停留处 mx 设置书签 x为a z任意字母 x 跳转到书签处 gt 增加缩进 n gt 增加以下b行的缩进 lt 减少缩进 n lt 减少以下n行的缩进 跳到上一段
  • uni-app修改页面背景色:

    1 设置全局背景色 法一 globalStyle navigationBarTextStyle black navigationBarTitleText 管理 navigationBarTitleText 管理 navigationBarB
  • 在Python中调用和执行JavaScript

    在Python中调用和执行JavaScript 引言 在Web开发中 Python和JavaScript是两种常用的编程语言 Python通常用于服务器端开发 而JavaScript则用于客户端浏览器中的脚本编写 然而 有时候我们需要在Py
  • Kubernetes 证书详解

    K8S 证书介绍 在 Kube apiserver 中提供了很多认证方式 其中最常用的就是 TLS 认证 当然也有 BootstrapToken BasicAuth 认证等 只要有一个认证通过 那么 Kube apiserver 即认为认证
  • PHP自学过程之 运算符与流程控制

    一 PHP的运算符 PHP中有丰富的运算符集 它们中大部分直接来自于C语言 按照不同功能区分 运算符可以分为 算术运算符 字符串运算符 赋值运算符 位运算符 条件运算符 以及逻辑运算符等 当各种运算符在同一个表达式中时 它们的运算是有一定的
  • 算法分析与设计——LeetCode Problem.547 Friend Circles

    问题详情 There are N students in a class Some of them are friends while some are not Their friendship is transitive in natur
  • vue 手动挂载html,vue中的.$mount('#app')手动挂载操作--龙方网络

    在Vue构造函数时 需要配置一个el属性 如果没有没有el属性时 可以使用 mount app 进行挂载 配置了el属性 new Vue el app router 如果没有配置el属性 可以使用手动挂载 mount app new Vue
  • 泊松过程、伽马分布、贝塔分布及狄利克雷分布

    泊松过程 伽马分布 贝塔分布及狄利克雷分布 1 泊松过程 1 1Poisson过程的定义 1 2Poisson过程的应用 2 伽马分布 2 1伽马分布的定义 2 2伽马分布的性质 2 3伽马分布与其他分布的关系 3 贝塔分布 3 1贝塔分布
  • 机器学习十大算法之CART

    一 概述 CART Classification And Regression Tree 即分类回归树算法 它是决策树的一种实现 通常决策树主要有三种实现 分别是ID3算法 CART算法和C4 5算法 CART算法是一种二分递归分割技术 把
  • python线性拟合、不确定性

    1 线性回归 可以直接调用sklearn中的linear model模块进行线性回归 import numpy as np from sklearn linear model import LinearRegression model Li
  • CTP使用

    1 CTP介绍 1 1 CTP简介 综合交易平台CTP Comprehensive Transaction Platform 是由上海期货信息技术有限公司 上海期货交易所的全资子公司 开发的期货交易平台 CTP平台以 新一代交易所系统 的核