日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++连接CTP接口实现简单量化交易(行情、交易、k线、策略)

發布時間:2024/1/1 c/c++ 69 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++连接CTP接口实现简单量化交易(行情、交易、k线、策略) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

對于量化交易來說,量化策略和技術系統缺一不可,為了知其所以然,本文實現了一個C++連接CTP接口進行仿真交易的demo,從接收行情、下訂單、數據處理到添加策略、掛載運行交易等多個環節來看一下量化交易的最簡單流程,管中窺豹,一探究竟。

?

準備工作

交易所接口

這里使用上期所提供的CTP接口API,通過CTP可以連接交易所進行行情接收交易。下載地址:CTP下載

本文使用的win32版本的,linux版本用法類似。

CTP接口包含以下內容:

?

  • ThostFtdcTraderApi.h:C++頭文件,包含交易相關的指令,如報單。
  • ThostFtdcMdApi.h:C++頭文件,包含獲取行情相關的指令。
  • ThostFtdcUserApiStruct.h:包含了所有用到的數據結構。
  • ThostFtdcUserApiDataType.h:包含了所有用到的數據類型。
  • thosttraderapi.lib、thosttraderapi.dll:交易部分的動態鏈接庫和靜態鏈接庫。
  • thostmduserapi.lib、thostmduserapi.dll:行情部分的動態鏈接庫和靜態鏈接庫。
  • error.dtd、error.xml:包含所有可能的錯誤信息。

?

?

整個開發包有2個核心頭文件包括4個核心接口
CThostFtdcMdApi接口和CThostFtdcTraderApi兩個頭文件,一個處理行情,一個處理交易

(1)處理行情的CThostFtdcMdApi接口有兩個類,分別是CThostFtdcMdApi和CThostFtdcMdSpi,以Api結尾的是用來下命令的,以Spi結尾的是用來響應命令的回調。

(2)處理交易的CThostFtdcTraderApi接口也有兩個類,分別是CThostFtdcTraderApi和CThostFtdcTraderSpi, ?通過CThostFtdcTraderApi向CTP發送操作請求,通過CThostFtdcTraderSpi接收CTP的操作響應。

?

期貨賬戶

要連接期貨交易所交易,需要開設自己的賬戶,實現期貨交易、銀期轉賬、保證金等功能,由于小白一般不會用實盤資金交易,所以此處推薦用上期所提供的simnow虛擬交易平臺simnow申請一個虛擬賬戶。

SIMNOW提供兩類數據前置地址:

(1)交易時段的地址,如09:00-15:00和21:00-02:30,使用第一套地址,這些數據是真實的行情數據,只是時間上比真實的行情會有延遲30秒左右(SIMNOW從交易所接收后轉發出來的)。

(2)非交易時段地址,這時的數據是歷史行情的播放,比如昨天的數據之類的,可以用來做程序調試。

?

建議選擇申請那個7x24行情的賬戶,便于開發調試。

?

開發步驟

工程總覽

?

其中,

?

  • CTP的API文件配置到工程
  • CustomMdSpi.h,CustomMdSpi.cpp是派生的行情回調類
  • CustomTradeSpi.h,CustomTradeSpi.cpp是派生的交易回調類
  • TickToKlineHelper.h,TickToKlineHelper.cpp是處理時序數據,轉換成K線的類
  • StrategyTrade.h,StrategyTrade.cpp是策略類
  • main.cpp是程序的入口

一個簡單的程序化交易系統需要完成的業務可以劃分為:
1.基本操作,比如登錄,訂閱等;
2.行情操作,比如對行情數據的接收,存儲等
3.訂單操作,比如報單;對報單,成交狀況的查詢;報單,成交狀況的私有回報等。
4.數據監聽和處理操作,比如接收到新數據之后的統計處理,滿足統計條件后的報單處理(其實這里就是我們的策略所在)

?

導入CTP接口庫

visual studio創建工程后,首先需要將ctp的頭文件以及鏈接庫(lib和dll)目錄配置到工程

?

?

?

  • // 鏈接庫
  • #pragma comment (lib, "thostmduserapi.lib")
  • #pragma comment (lib, "thosttraderapi.lib")
  • ?

    ?

    全局參數

    連接到交易所,需要配置經紀商代碼、帳戶名、密碼以及訂閱合約和買賣合約的相關參數

  • // ---- 全局變量 ---- //
  • // 公共參數
  • TThostFtdcBrokerIDType gBrokerID = "9999"; // 模擬經紀商代碼
  • TThostFtdcInvestorIDType gInvesterID = ""; // 投資者賬戶名
  • TThostFtdcPasswordType gInvesterPassword = ""; // 投資者密碼
  • // 行情參數
  • CThostFtdcMdApi *g_pMdUserApi = nullptr; // 行情指針
  • char gMdFrontAddr[] = "tcp://180.168.146.187:10010"; // 模擬行情前置地址
  • char *g_pInstrumentID[] = {"TF1706", "zn1705", "cs1801", "CF705"}; // 行情合約代碼列表,中、上、大、鄭交易所各選一種
  • int instrumentNum = 4; // 行情合約訂閱數量
  • unordered_map<string, TickToKlineHelper> g_KlineHash; // 不同合約的k線存儲表
  • // 交易參數
  • CThostFtdcTraderApi *g_pTradeUserApi = nullptr; // 交易指針
  • char gTradeFrontAddr[] = "tcp://180.168.146.187:10001"; // 模擬交易前置地址
  • TThostFtdcInstrumentIDType g_pTradeInstrumentID = "m1709"; // 所交易的合約代碼
  • TThostFtdcDirectionType gTradeDirection = THOST_FTDC_D_Sell; // 買賣方向
  • TThostFtdcPriceType gLimitPrice = 2818; // 交易價格

  • 這里只是簡單的寫一下,真實完整的交易系統中,一般用配置文件,有用戶去定制

    ?

    行情回調類

    繼承CThostFtdcMdSpi實現自己的行情回調類CustomMdSpi,在系統運行時這些重寫的函數會被CTP的系統api回調從而實現個性化行情

    CustomMdSpi頭文件

    ?

  • #pragma once
  • // ---- 派生的行情類 ---- //
  • #include <vector>
  • #include "CTP_API/ThostFtdcMdApi.h"
  • class CustomMdSpi: public CThostFtdcMdSpi
  • {
  • // ---- 繼承自CTP父類的回調接口并實現 ---- //
  • public:
  • ///當客戶端與交易后臺建立起通信連接時(還未登錄前),該方法被調用。
  • void OnFrontConnected();
  • ///當客戶端與交易后臺通信連接斷開時,該方法被調用。當發生這個情況后,API會自動重新連接,客戶端可不做處理。
  • ///@param nReason 錯誤原因
  • /// 0x1001 網絡讀失敗
  • /// 0x1002 網絡寫失敗
  • /// 0x2001 接收心跳超時
  • /// 0x2002 發送心跳失敗
  • /// 0x2003 收到錯誤報文
  • void OnFrontDisconnected(int nReason);
  • ///心跳超時警告。當長時間未收到報文時,該方法被調用。
  • ///@param nTimeLapse 距離上次接收報文的時間
  • void OnHeartBeatWarning(int nTimeLapse);
  • ///登錄請求響應
  • void OnRspUserLogin(CThostFtdcRspUserLoginField *pRspUserLogin, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
  • ///登出請求響應
  • void OnRspUserLogout(CThostFtdcUserLogoutField *pUserLogout, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
  • ///錯誤應答
  • void OnRspError(CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
  • ///訂閱行情應答
  • void OnRspSubMarketData(CThostFtdcSpecificInstrumentField *pSpecificInstrument, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
  • ///取消訂閱行情應答
  • void OnRspUnSubMarketData(CThostFtdcSpecificInstrumentField *pSpecificInstrument, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
  • ///訂閱詢價應答
  • void OnRspSubForQuoteRsp(CThostFtdcSpecificInstrumentField *pSpecificInstrument, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
  • ///取消訂閱詢價應答
  • void OnRspUnSubForQuoteRsp(CThostFtdcSpecificInstrumentField *pSpecificInstrument, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
  • ///深度行情通知
  • void OnRtnDepthMarketData(CThostFtdcDepthMarketDataField *pDepthMarketData);
  • ///詢價通知
  • void OnRtnForQuoteRsp(CThostFtdcForQuoteRspField *pForQuoteRsp);
  • };
  • ?

    都是重寫回調函數

    連接應答

    ?

  • // 連接成功應答
  • void CustomMdSpi::OnFrontConnected()
  • {
  • std::cout << "=====建立網絡連接成功=====" << std::endl;
  • // 開始登錄
  • CThostFtdcReqUserLoginField loginReq;
  • memset(&loginReq, 0, sizeof(loginReq));
  • strcpy(loginReq.BrokerID, gBrokerID);
  • strcpy(loginReq.UserID, gInvesterID);
  • strcpy(loginReq.Password, gInvesterPassword);
  • static int requestID = 0; // 請求編號
  • int rt = g_pMdUserApi->ReqUserLogin(&loginReq, requestID);
  • if (!rt)
  • std::cout << ">>>>>>發送登錄請求成功" << std::endl;
  • else
  • std::cerr << "--->>>發送登錄請求失敗" << std::endl;
  • }
  • ?

    登錄應答

    ?

  • // 登錄應答
  • void CustomMdSpi::OnRspUserLogin(
  • CThostFtdcRspUserLoginField *pRspUserLogin,
  • CThostFtdcRspInfoField *pRspInfo,
  • int nRequestID,
  • bool bIsLast)
  • {
  • bool bResult = pRspInfo && (pRspInfo->ErrorID != 0);
  • if (!bResult)
  • {
  • std::cout << "=====賬戶登錄成功=====" << std::endl;
  • std::cout << "交易日: " << pRspUserLogin->TradingDay << std::endl;
  • std::cout << "登錄時間: " << pRspUserLogin->LoginTime << std::endl;
  • std::cout << "經紀商: " << pRspUserLogin->BrokerID << std::endl;
  • std::cout << "帳戶名: " << pRspUserLogin->UserID << std::endl;
  • // 開始訂閱行情
  • int rt = g_pMdUserApi->SubscribeMarketData(g_pInstrumentID, instrumentNum);
  • if (!rt)
  • std::cout << ">>>>>>發送訂閱行情請求成功" << std::endl;
  • else
  • std::cerr << "--->>>發送訂閱行情請求失敗" << std::endl;
  • }
  • else
  • std::cerr << "返回錯誤--->>> ErrorID=" << pRspInfo->ErrorID << ", ErrorMsg=" << pRspInfo->ErrorMsg << std::endl;
  • }
  • ?

    訂閱行情應答

    ?

  • // 訂閱行情應答
  • void CustomMdSpi::OnRspSubMarketData(
  • CThostFtdcSpecificInstrumentField *pSpecificInstrument,
  • CThostFtdcRspInfoField *pRspInfo,
  • int nRequestID,
  • bool bIsLast)
  • {
  • bool bResult = pRspInfo && (pRspInfo->ErrorID != 0);
  • if (!bResult)
  • {
  • std::cout << "=====訂閱行情成功=====" << std::endl;
  • std::cout << "合約代碼: " << pSpecificInstrument->InstrumentID << std::endl;
  • // 如果需要存入文件或者數據庫,在這里創建表頭,不同的合約單獨存儲
  • char filePath[100] = {'\0'};
  • sprintf(filePath, "%s_market_data.csv", pSpecificInstrument->InstrumentID);
  • std::ofstream outFile;
  • outFile.open(filePath, std::ios::out); // 新開文件
  • outFile << "合約代碼" << ","
  • << "更新時間" << ","
  • << "最新價" << ","
  • << "成交量" << ","
  • << "買價一" << ","
  • << "買量一" << ","
  • << "賣價一" << ","
  • << "賣量一" << ","
  • << "持倉量" << ","
  • << "換手率"
  • << std::endl;
  • outFile.close();
  • }
  • else
  • std::cerr << "返回錯誤--->>> ErrorID=" << pRspInfo->ErrorID << ", ErrorMsg=" << pRspInfo->ErrorMsg << std::endl;
  • }
  • ?

    • 因為是異步接口,這里連接、登錄、訂閱行情是一步套一步來調用的,在運行過程中,會啟動一個行情線程,交易所每500ms會推送一個訂閱的行情tick數據,因此,某些接口會被連續間隔調用,直到連接關閉
    • 收到行情后除了存在內存,也可以用文本文件或者數據庫等形式存儲起來,在這里創建初始文件或者建庫

    深度行情通知

  • // 行情詳情通知
  • void CustomMdSpi::OnRtnDepthMarketData(CThostFtdcDepthMarketDataField *pDepthMarketData)
  • {
  • // 打印行情,字段較多,截取部分
  • std::cout << "=====獲得深度行情=====" << std::endl;
  • std::cout << "交易日: " << pDepthMarketData->TradingDay << std::endl;
  • std::cout << "交易所代碼: " << pDepthMarketData->ExchangeID << std::endl;
  • std::cout << "合約代碼: " << pDepthMarketData->InstrumentID << std::endl;
  • std::cout << "合約在交易所的代碼: " << pDepthMarketData->ExchangeInstID << std::endl;
  • std::cout << "最新價: " << pDepthMarketData->LastPrice << std::endl;
  • std::cout << "數量: " << pDepthMarketData->Volume << std::endl;
  • // 如果只獲取某一個合約行情,可以逐tick地存入文件或數據庫
  • char filePath[100] = {'\0'};
  • sprintf(filePath, "%s_market_data.csv", pDepthMarketData->InstrumentID);
  • std::ofstream outFile;
  • outFile.open(filePath, std::ios::app); // 文件追加寫入
  • outFile << pDepthMarketData->InstrumentID << ","
  • << pDepthMarketData->UpdateTime << "." << pDepthMarketData->UpdateMillisec << ","
  • << pDepthMarketData->LastPrice << ","
  • << pDepthMarketData->Volume << ","
  • << pDepthMarketData->BidPrice1 << ","
  • << pDepthMarketData->BidVolume1 << ","
  • << pDepthMarketData->AskPrice1 << ","
  • << pDepthMarketData->AskVolume1 << ","
  • << pDepthMarketData->OpenInterest << ","
  • << pDepthMarketData->Turnover << std::endl;
  • outFile.close();
  • // 計算實時k線
  • std::string instrumentKey = std::string(pDepthMarketData->InstrumentID);
  • if (g_KlineHash.find(instrumentKey) == g_KlineHash.end())
  • g_KlineHash[instrumentKey] = TickToKlineHelper();
  • g_KlineHash[instrumentKey].KLineFromRealtimeData(pDepthMarketData);
  • // 取消訂閱行情
  • //int rt = g_pMdUserApi->UnSubscribeMarketData(g_pInstrumentID, instrumentNum);
  • //if (!rt)
  • // std::cout << ">>>>>>發送取消訂閱行情請求成功" << std::endl;
  • //else
  • // std::cerr << "--->>>發送取消訂閱行情請求失敗" << std::endl;
  • }
    • 每個tick世間節點系統都會調用這個函數,推送具體的行情截面數據
    • 可以在此處將行情寫到本地,或者做一些數據處理(例如實時K線計算,判斷是否觸發策略等)

    ?

    交易回調類

    同理,也需要繼承CThostFtdcTraderSpi來實現自己的CustomTradeSpi類,用于交易下單、報單等操作的回調

    CustomTradeSpi頭文件

    ?

  • #pragma once
  • // ---- 派生的交易類 ---- //
  • #include "CTP_API/ThostFtdcTraderApi.h"
  • class CustomTradeSpi : public CThostFtdcTraderSpi
  • {
  • // ---- ctp_api部分回調接口 ---- //
  • public:
  • ///當客戶端與交易后臺建立起通信連接時(還未登錄前),該方法被調用。
  • void OnFrontConnected();
  • ///登錄請求響應
  • void OnRspUserLogin(CThostFtdcRspUserLoginField *pRspUserLogin, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
  • ///錯誤應答
  • void OnRspError(CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
  • ///當客戶端與交易后臺通信連接斷開時,該方法被調用。當發生這個情況后,API會自動重新連接,客戶端可不做處理。
  • void OnFrontDisconnected(int nReason);
  • ///心跳超時警告。當長時間未收到報文時,該方法被調用。
  • void OnHeartBeatWarning(int nTimeLapse);
  • ///登出請求響應
  • void OnRspUserLogout(CThostFtdcUserLogoutField *pUserLogout, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
  • ///投資者結算結果確認響應
  • void OnRspSettlementInfoConfirm(CThostFtdcSettlementInfoConfirmField *pSettlementInfoConfirm, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
  • ///請求查詢合約響應
  • void OnRspQryInstrument(CThostFtdcInstrumentField *pInstrument, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
  • ///請求查詢資金賬戶響應
  • void OnRspQryTradingAccount(CThostFtdcTradingAccountField *pTradingAccount, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
  • ///請求查詢投資者持倉響應
  • void OnRspQryInvestorPosition(CThostFtdcInvestorPositionField *pInvestorPosition, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
  • ///報單錄入請求響應
  • void OnRspOrderInsert(CThostFtdcInputOrderField *pInputOrder, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
  • ///報單操作請求響應
  • void OnRspOrderAction(CThostFtdcInputOrderActionField *pInputOrderAction, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
  • ///報單通知
  • void OnRtnOrder(CThostFtdcOrderField *pOrder);
  • ///成交通知
  • void OnRtnTrade(CThostFtdcTradeField *pTrade);
  • // ---- 自定義函數 ---- //
  • public:
  • bool loginFlag; // 登陸成功的標識
  • void reqOrderInsert(
  • TThostFtdcInstrumentIDType instrumentID,
  • TThostFtdcPriceType price,
  • TThostFtdcVolumeType volume,
  • TThostFtdcDirectionType direction); // 個性化報單錄入,外部調用
  • private:
  • void reqUserLogin(); // 登錄請求
  • void reqUserLogout(); // 登出請求
  • void reqSettlementInfoConfirm(); // 投資者結果確認
  • void reqQueryInstrument(); // 請求查詢合約
  • void reqQueryTradingAccount(); // 請求查詢資金帳戶
  • void reqQueryInvestorPosition(); // 請求查詢投資者持倉
  • void reqOrderInsert(); // 請求報單錄入
  • void reqOrderAction(CThostFtdcOrderField *pOrder); // 請求報單操作
  • bool isErrorRspInfo(CThostFtdcRspInfoField *pRspInfo); // 是否收到錯誤信息
  • bool isMyOrder(CThostFtdcOrderField *pOrder); // 是否我的報單回報
  • bool isTradingOrder(CThostFtdcOrderField *pOrder); // 是否正在交易的報單
  • };
  • ?

    ?

    除了重寫的基類函數,還自己封裝一些主動調用的操作函數,比如登入登出、下單報單、查詢報單等

    ?

    ?

    ?

    登錄應答

    ?

  • void CustomTradeSpi::OnRspUserLogin(
  • CThostFtdcRspUserLoginField *pRspUserLogin,
  • CThostFtdcRspInfoField *pRspInfo,
  • int nRequestID,
  • bool bIsLast)
  • {
  • if (!isErrorRspInfo(pRspInfo))
  • {
  • std::cout << "=====賬戶登錄成功=====" << std::endl;
  • loginFlag = true;
  • std::cout << "交易日: " << pRspUserLogin->TradingDay << std::endl;
  • std::cout << "登錄時間: " << pRspUserLogin->LoginTime << std::endl;
  • std::cout << "經紀商: " << pRspUserLogin->BrokerID << std::endl;
  • std::cout << "帳戶名: " << pRspUserLogin->UserID << std::endl;
  • // 保存會話參數
  • trade_front_id = pRspUserLogin->FrontID;
  • session_id = pRspUserLogin->SessionID;
  • strcpy(order_ref, pRspUserLogin->MaxOrderRef);
  • // 投資者結算結果確認
  • reqSettlementInfoConfirm();
  • }
  • }
  • 查詢投資者結算結果應答

    ?

    ?

  • void CustomTradeSpi::OnRspSettlementInfoConfirm(
  • CThostFtdcSettlementInfoConfirmField *pSettlementInfoConfirm,
  • CThostFtdcRspInfoField *pRspInfo,
  • int nRequestID,
  • bool bIsLast)
  • {
  • if (!isErrorRspInfo(pRspInfo))
  • {
  • std::cout << "=====投資者結算結果確認成功=====" << std::endl;
  • std::cout << "確認日期: " << pSettlementInfoConfirm->ConfirmDate << std::endl;
  • std::cout << "確認時間: " << pSettlementInfoConfirm->ConfirmTime << std::endl;
  • // 請求查詢合約
  • reqQueryInstrument();
  • }
  • }
  • 查詢合約應答

    ?

    ?

  • void CustomTradeSpi::OnRspQryInstrument(
  • CThostFtdcInstrumentField *pInstrument,
  • CThostFtdcRspInfoField *pRspInfo,
  • int nRequestID,
  • bool bIsLast)
  • {
  • if (!isErrorRspInfo(pRspInfo))
  • {
  • std::cout << "=====查詢合約結果成功=====" << std::endl;
  • std::cout << "交易所代碼: " << pInstrument->ExchangeID << std::endl;
  • std::cout << "合約代碼: " << pInstrument->InstrumentID << std::endl;
  • std::cout << "合約在交易所的代碼: " << pInstrument->ExchangeInstID << std::endl;
  • std::cout << "執行價: " << pInstrument->StrikePrice << std::endl;
  • std::cout << "到期日: " << pInstrument->EndDelivDate << std::endl;
  • std::cout << "當前交易狀態: " << pInstrument->IsTrading << std::endl;
  • // 請求查詢投資者資金賬戶
  • reqQueryTradingAccount();
  • }
  • }
  • 查詢投資者資金帳戶應答

    ?

    ?

  • void CustomTradeSpi::OnRspQryTradingAccount(
  • CThostFtdcTradingAccountField *pTradingAccount,
  • CThostFtdcRspInfoField *pRspInfo,
  • int nRequestID,
  • bool bIsLast)
  • {
  • if (!isErrorRspInfo(pRspInfo))
  • {
  • std::cout << "=====查詢投資者資金賬戶成功=====" << std::endl;
  • std::cout << "投資者賬號: " << pTradingAccount->AccountID << std::endl;
  • std::cout << "可用資金: " << pTradingAccount->Available << std::endl;
  • std::cout << "可取資金: " << pTradingAccount->WithdrawQuota << std::endl;
  • std::cout << "當前保證金: " << pTradingAccount->CurrMargin << std::endl;
  • std::cout << "平倉盈虧: " << pTradingAccount->CloseProfit << std::endl;
  • // 請求查詢投資者持倉
  • reqQueryInvestorPosition();
  • }
  • }
  • 查詢投資者持倉應答

    ?

    ?

  • void CustomTradeSpi::OnRspQryInvestorPosition(
  • CThostFtdcInvestorPositionField *pInvestorPosition,
  • CThostFtdcRspInfoField *pRspInfo,
  • int nRequestID,
  • bool bIsLast)
  • {
  • if (!isErrorRspInfo(pRspInfo))
  • {
  • std::cout << "=====查詢投資者持倉成功=====" << std::endl;
  • if (pInvestorPosition)
  • {
  • std::cout << "合約代碼: " << pInvestorPosition->InstrumentID << std::endl;
  • std::cout << "開倉價格: " << pInvestorPosition->OpenAmount << std::endl;
  • std::cout << "開倉量: " << pInvestorPosition->OpenVolume << std::endl;
  • std::cout << "開倉方向: " << pInvestorPosition->PosiDirection << std::endl;
  • std::cout << "占用保證金:" << pInvestorPosition->UseMargin << std::endl;
  • }
  • else
  • std::cout << "----->該合約未持倉" << std::endl;
  • // 報單錄入請求(這里是一部接口,此處是按順序執行)
  • /*if (loginFlag)
  • reqOrderInsert();*/
  • if (loginFlag)
  • reqOrderInsert(g_pTradeInstrumentID, gLimitPrice, 1, gTradeDirection); // 自定義一筆交易
  • // 策略交易
  • /*std::cout << "=====開始進入策略交易=====" << std::endl;
  • while (loginFlag)
  • StrategyCheckAndTrade(g_pTradeInstrumentID, this);*/
  • }
  • }
  • 這里把下單錄入的操作放在了持倉結果出來之后的回調里面,策略交易也簡單的放在了這里,真實的情況下,應該是由行情觸發某個策略條件開一個線程進行策略交易

    ?

    下單操作

    ?

    ?

  • void CustomTradeSpi::reqOrderInsert(
  • TThostFtdcInstrumentIDType instrumentID,
  • TThostFtdcPriceType price,
  • TThostFtdcVolumeType volume,
  • TThostFtdcDirectionType direction)
  • {
  • CThostFtdcInputOrderField orderInsertReq;
  • memset(&orderInsertReq, 0, sizeof(orderInsertReq));
  • ///經紀公司代碼
  • strcpy(orderInsertReq.BrokerID, gBrokerID);
  • ///投資者代碼
  • strcpy(orderInsertReq.InvestorID, gInvesterID);
  • ///合約代碼
  • strcpy(orderInsertReq.InstrumentID, instrumentID);
  • ///報單引用
  • strcpy(orderInsertReq.OrderRef, order_ref);
  • ///報單價格條件: 限價
  • orderInsertReq.OrderPriceType = THOST_FTDC_OPT_LimitPrice;
  • ///買賣方向:
  • orderInsertReq.Direction = direction;
  • ///組合開平標志: 開倉
  • orderInsertReq.CombOffsetFlag[0] = THOST_FTDC_OF_Open;
  • ///組合投機套保標志
  • orderInsertReq.CombHedgeFlag[0] = THOST_FTDC_HF_Speculation;
  • ///價格
  • orderInsertReq.LimitPrice = price;
  • ///數量:1
  • orderInsertReq.VolumeTotalOriginal = volume;
  • ///有效期類型: 當日有效
  • orderInsertReq.TimeCondition = THOST_FTDC_TC_GFD;
  • ///成交量類型: 任何數量
  • orderInsertReq.VolumeCondition = THOST_FTDC_VC_AV;
  • ///最小成交量: 1
  • orderInsertReq.MinVolume = 1;
  • ///觸發條件: 立即
  • orderInsertReq.ContingentCondition = THOST_FTDC_CC_Immediately;
  • ///強平原因: 非強平
  • orderInsertReq.ForceCloseReason = THOST_FTDC_FCC_NotForceClose;
  • ///自動掛起標志: 否
  • orderInsertReq.IsAutoSuspend = 0;
  • ///用戶強評標志: 否
  • orderInsertReq.UserForceClose = 0;
  • static int requestID = 0; // 請求編號
  • int rt = g_pTradeUserApi->ReqOrderInsert(&orderInsertReq, ++requestID);
  • if (!rt)
  • std::cout << ">>>>>>發送報單錄入請求成功" << std::endl;
  • else
  • std::cerr << "--->>>發送報單錄入請求失敗" << std::endl;
  • }
  • 通過重載寫了兩個函數,一個是用默認參數下單,一個可以傳參下單,比如設定合約代碼、價格、數量等

    ?

    報單操作

    ?

  • void CustomTradeSpi::reqOrderAction(CThostFtdcOrderField *pOrder)
  • {
  • static bool orderActionSentFlag = false; // 是否發送了報單
  • if (orderActionSentFlag)
  • return;
  • CThostFtdcInputOrderActionField orderActionReq;
  • memset(&orderActionReq, 0, sizeof(orderActionReq));
  • ///經紀公司代碼
  • strcpy(orderActionReq.BrokerID, pOrder->BrokerID);
  • ///投資者代碼
  • strcpy(orderActionReq.InvestorID, pOrder->InvestorID);
  • ///報單操作引用
  • // TThostFtdcOrderActionRefType OrderActionRef;
  • ///報單引用
  • strcpy(orderActionReq.OrderRef, pOrder->OrderRef);
  • ///請求編號
  • // TThostFtdcRequestIDType RequestID;
  • ///前置編號
  • orderActionReq.FrontID = trade_front_id;
  • ///會話編號
  • orderActionReq.SessionID = session_id;
  • ///交易所代碼
  • // TThostFtdcExchangeIDType ExchangeID;
  • ///報單編號
  • // TThostFtdcOrderSysIDType OrderSysID;
  • ///操作標志
  • orderActionReq.ActionFlag = THOST_FTDC_AF_Delete;
  • ///價格
  • // TThostFtdcPriceType LimitPrice;
  • ///數量變化
  • // TThostFtdcVolumeType VolumeChange;
  • ///用戶代碼
  • // TThostFtdcUserIDType UserID;
  • ///合約代碼
  • strcpy(orderActionReq.InstrumentID, pOrder->InstrumentID);
  • static int requestID = 0; // 請求編號
  • int rt = g_pTradeUserApi->ReqOrderAction(&orderActionReq, ++requestID);
  • if (!rt)
  • std::cout << ">>>>>>發送報單操作請求成功" << std::endl;
  • else
  • std::cerr << "--->>>發送報單操作請求失敗" << std::endl;
  • orderActionSentFlag = true;
  • }
  • ?

    主要是對于未成交的訂單進行編輯或者撤銷操作

    ?

    ?

    報單應答

    ?

  • void CustomTradeSpi::OnRtnOrder(CThostFtdcOrderField *pOrder)
  • {
  • char str[10];
  • sprintf(str, "%d", pOrder->OrderSubmitStatus);
  • int orderState = atoi(str) - 48; //報單狀態0=已經提交,3=已經接受
  • std::cout << "=====收到報單應答=====" << std::endl;
  • if (isMyOrder(pOrder))
  • {
  • if (isTradingOrder(pOrder))
  • {
  • std::cout << "--->>> 等待成交中!" << std::endl;
  • //reqOrderAction(pOrder); // 這里可以撤單
  • //reqUserLogout(); // 登出測試
  • }
  • else if (pOrder->OrderStatus == THOST_FTDC_OST_Canceled)
  • std::cout << "--->>> 撤單成功!" << std::endl;
  • }
  • }
  • void CustomTradeSpi::OnRtnTrade(CThostFtdcTradeField *pTrade)
  • {
  • std::cout << "=====報單成功成交=====" << std::endl;
  • std::cout << "成交時間: " << pTrade->TradeTime << std::endl;
  • std::cout << "合約代碼: " << pTrade->InstrumentID << std::endl;
  • std::cout << "成交價格: " << pTrade->Price << std::endl;
  • std::cout << "成交量: " << pTrade->Volume << std::endl;
  • std::cout << "開平倉方向: " << pTrade->Direction << std::endl;
  • }
  • 等待成交進行輪詢可以選擇報單操作,成交完成后的應答

    ?

    時間序列轉K線

    從交易拿到的tick數據是時間序列數據,在證券交易中其實還需要根據時間序列算出一些技術指標數據,例如MACD,KDJ、K線等,這里簡單地對數據做一下處理,寫一個TickToKlineHelper將時間序列專程K線

    ?

    ?

    K線數據結構

    ?

  • // k線數據結構
  • struct KLineDataType
  • {
  • double open_price; // 開
  • double high_price; // 高
  • double low_price; // 低
  • double close_price; // 收
  • int volume; // 量
  • };

  • 轉換函數

    ?

    ?

  • void TickToKlineHelper::KLineFromLocalData(const std::string &sFilePath, const std::string &dFilePath)
  • {
  • // 先清理殘留數據
  • m_priceVec.clear();
  • m_volumeVec.clear();
  • m_KLineDataArray.clear();
  • std::cout << "開始轉換tick到k線..." << std::endl;
  • // 默認讀取的tick數據表有4個字段:合約代碼、更新時間、最新價、成交量
  • std::ifstream srcInFile;
  • std::ofstream dstOutFile;
  • srcInFile.open(sFilePath, std::ios::in);
  • dstOutFile.open(dFilePath, std::ios::out);
  • dstOutFile << "開盤價" << ','
  • << "最高價" << ','
  • << "最低價" << ','
  • << "收盤價" << ','
  • << "成交量" << std::endl;
  • // 一遍解析文件一邊計算k線數據,1分鐘k線每次讀取60 * 2 = 120行數據
  • std::string lineStr;
  • bool isFirstLine = true;
  • while (std::getline(srcInFile, lineStr))
  • {
  • if (isFirstLine)
  • {
  • // 跳過第一行表頭
  • isFirstLine = false;
  • continue;
  • }
  • std::istringstream ss(lineStr);
  • std::string fieldStr;
  • int count = 4;
  • while (std::getline(ss, fieldStr, ','))
  • {
  • count--;
  • if (count == 1)
  • m_priceVec.push_back(std::atof(fieldStr.c_str()));
  • else if (count == 0)
  • {
  • m_volumeVec.push_back(std::atoi(fieldStr.c_str()));
  • break;
  • }
  • }
  • // 計算k線
  • if (m_priceVec.size() == kDataLineNum)
  • {
  • KLineDataType k_line_data;
  • k_line_data.open_price = m_priceVec.front();
  • k_line_data.high_price = *std::max_element(m_priceVec.cbegin(), m_priceVec.cend());
  • k_line_data.low_price = *std::min_element(m_priceVec.cbegin(), m_priceVec.cend());
  • k_line_data.close_price = m_priceVec.back();
  • // 成交量的真實的算法是當前區間最后一個成交量減去上去一個區間最后一個成交量
  • k_line_data.volume = m_volumeVec.back() - m_volumeVec.front();
  • //m_KLineDataArray.push_back(k_line_data); // 此處可以存到內存
  • dstOutFile << k_line_data.open_price << ','
  • << k_line_data.high_price << ','
  • << k_line_data.low_price << ','
  • << k_line_data.close_price << ','
  • << k_line_data.volume << std::endl;
  • m_priceVec.clear();
  • m_volumeVec.clear();
  • }
  • }
  • srcInFile.close();
  • dstOutFile.close();
  • std::cout << "k線生成成功" << std::endl;
  • }
  • void TickToKlineHelper::KLineFromRealtimeData(CThostFtdcDepthMarketDataField *pDepthMarketData)
  • {
  • m_priceVec.push_back(pDepthMarketData->LastPrice);
  • m_volumeVec.push_back(pDepthMarketData->Volume);
  • if (m_priceVec.size() == kDataLineNum)
  • {
  • KLineDataType k_line_data;
  • k_line_data.open_price = m_priceVec.front();
  • k_line_data.high_price = *std::max_element(m_priceVec.cbegin(), m_priceVec.cend());
  • k_line_data.low_price = *std::min_element(m_priceVec.cbegin(), m_priceVec.cend());
  • k_line_data.close_price = m_priceVec.back();
  • // 成交量的真實的算法是當前區間最后一個成交量減去上去一個區間最后一個成交量
  • k_line_data.volume = m_volumeVec.back() - m_volumeVec.front();
  • m_KLineDataArray.push_back(k_line_data); // 此處可以存到內存
  • m_priceVec.clear();
  • m_volumeVec.clear();
  • }
  • }
  • ?

    • 可以從本地文件中讀取行情數據,進行離線轉換,也可以在接受到行情時進行實時計算
    • 基本思想是,針對每個合約代碼,建立字典,維持一個行情數組,當時間間隔達到要求(例如分鐘、分時、分日)時計算該時段的開、高、低、收、成交量等數據存入K線數組
    • 最低時間單位的K線計算出來之后,高時間間隔的K線數據可以根據低時間間隔的K線計算出來(例如,算出了分鐘K,那么分時K就根據分鐘K來算)
    • 本例子中只是實現了一個大概的原理,非常不精確,僅供參考

    策略交易

    量化交易系統最終是需要將編寫的策略代碼掛載到系統中進行策略交易的,這里做了一個簡單的實現

    StrategyTrade.h

  • #pragma once
  • // ---- 簡單策略交易的類 ---- //
  • #include <functional>
  • #include "CTP_API/ThostFtdcUserApiStruct.h"
  • #include "TickToKlineHelper.h"
  • #include "CustomTradeSpi.h"
  • typedef void(*reqOrderInsertFun)(
  • TThostFtdcInstrumentIDType instrumentID,
  • TThostFtdcPriceType price,
  • TThostFtdcVolumeType volume,
  • TThostFtdcDirectionType direction);
  • using ReqOrderInsertFunctionType = std::function<
  • void(TThostFtdcInstrumentIDType instrumentID,
  • TThostFtdcPriceType price,
  • TThostFtdcVolumeType volume,
  • TThostFtdcDirectionType direction)>;
  • void StrategyCheckAndTrade(TThostFtdcInstrumentIDType instrumentID, CustomTradeSpi *customTradeSpi);

  • StrategyTrade.cpp

  • #include <vector>
  • #include <string>
  • #include <unordered_map>
  • #include <thread>
  • #include <mutex>
  • #include "StrategyTrade.h"
  • #include "CustomTradeSpi.h"
  • extern std::unordered_map<std::string, TickToKlineHelper> g_KlineHash;
  • // 線程互斥量
  • std::mutex marketDataMutex;
  • void StrategyCheckAndTrade(TThostFtdcInstrumentIDType instrumentID, CustomTradeSpi *customTradeSpi)
  • {
  • // 加鎖
  • std::lock_guard<std::mutex> lk(marketDataMutex);
  • TickToKlineHelper tickToKlineObject = g_KlineHash.at(std::string(instrumentID));
  • // 策略
  • std::vector<double> priceVec = tickToKlineObject.m_priceVec;
  • if (priceVec.size() >= 3)
  • {
  • int len = priceVec.size();
  • // 最后連續三個上漲就買開倉,反之就賣開倉,這里暫時用最后一個價格下單
  • if (priceVec[len - 1] > priceVec[len - 2] && priceVec[len - 2] > priceVec[len - 3])
  • customTradeSpi->reqOrderInsert(instrumentID, priceVec[len - 1], 1, THOST_FTDC_D_Buy);
  • else if (priceVec[len - 1] < priceVec[len - 2] && priceVec[len - 2] < priceVec[len - 3])
  • customTradeSpi->reqOrderInsert(instrumentID, priceVec[len - 1], 1, THOST_FTDC_D_Buy);
  • }
  • }
    • 基本思想,針對指定合約,判斷如果連續三個上漲就買開倉,連續三個下跌就賣開倉,價格都是用最新價
    • 因為行情和交易是分開的線程,涉及到線程競爭,所以在實際下單時需要加入互斥鎖,線程同步
    • 策略如何被行情觸發然后交易其實需要用事件驅動來做的,這里沒有實現T_T

    入口

    main.cpp

  • int main()
  • {
  • // 賬號密碼
  • cout << "請輸入賬號: ";
  • scanf("%s", gInvesterID);
  • cout << "請輸入密碼: ";
  • scanf("%s", gInvesterPassword);
  • // 初始化行情線程
  • cout << "初始化行情..." << endl;
  • g_pMdUserApi = CThostFtdcMdApi::CreateFtdcMdApi(); // 創建行情實例
  • CThostFtdcMdSpi *pMdUserSpi = new CustomMdSpi; // 創建行情回調實例
  • g_pMdUserApi->RegisterSpi(pMdUserSpi); // 注冊事件類
  • g_pMdUserApi->RegisterFront(gMdFrontAddr); // 設置行情前置地址
  • g_pMdUserApi->Init(); // 連接運行
  • // 初始化交易線程
  • cout << "初始化交易..." << endl;
  • g_pTradeUserApi = CThostFtdcTraderApi::CreateFtdcTraderApi(); // 創建交易實例
  • //CThostFtdcTraderSpi *pTradeSpi = new CustomTradeSpi;
  • CustomTradeSpi *pTradeSpi = new CustomTradeSpi; // 創建交易回調實例
  • g_pTradeUserApi->RegisterSpi(pTradeSpi); // 注冊事件類
  • g_pTradeUserApi->SubscribePublicTopic(THOST_TERT_RESTART); // 訂閱公共流
  • g_pTradeUserApi->SubscribePrivateTopic(THOST_TERT_RESTART); // 訂閱私有流
  • g_pTradeUserApi->RegisterFront(gTradeFrontAddr); // 設置交易前置地址
  • g_pTradeUserApi->Init(); // 連接運行
  • // 等到線程退出
  • g_pMdUserApi->Join();
  • delete pMdUserSpi;
  • g_pMdUserApi->Release();
  • g_pTradeUserApi->Join();
  • delete pTradeSpi;
  • g_pTradeUserApi->Release();
  • // 轉換本地k線數據
  • //TickToKlineHelper tickToKlineHelper;
  • //tickToKlineHelper.KLineFromLocalData("market_data.csv", "K_line_data.csv");
  • getchar();
  • return 0;
  • }
    • CThostFtdcMdApi跟CustomMdSpi要建立關聯,CThostFtdcTraderApi跟CustomTradeSpi建立關聯,其實就是類似于函數注冊
    • 配置行情和交易地址
    • 行情和交易分別是不同的線程,注意線程同步
    • 記得內存回收

    運行結果

    行情

    應答日志

    ?

    存成csv表格

    ?

    交易

    應答日志

    ?

    ?

    K線數據

    ?

    ?

    ?

    ?

    報單情況

    用上期所的快期軟件,登錄上自己的賬號之后,從過程序下單,在這個界面里能看到實時的報單成交狀況

    ?

    ?

    源碼下載

    ?

    csdn:demo

    ?

    github:demo

    ?

    結語

    ?

    本文旨在為剛接觸CTP的小白們拋磚引玉,各交易接口的深度運用還需要看官方開發文檔。

    另外,對于完整的量化交易系統來說,不僅要具備行情、交易、策略模塊,事件驅動、風控、回測模塊以及底層的數據存儲、網絡并發都是需要深入鉆研的方面,金融工程的Quant Researcher可以只專注于數據的分析、策略的研發,但是對于程序員Quant Developer來說,如何設計和開發一個高并發、低延遲、功能完善與策略結合緊密的量化交易系統的確是一項需要不斷完善的工程。

    ?

    ps:如果需要更高級和細致甚至可以用于實盤的功能,比如完整的開源交易系統,數據系統,算法交易,數據和交易接口等完備的解決方案,由于博客回復不現實,只能私信聯系啦~

    支持是知識分享的動力,有問題可掃碼哦

    ?

    總結

    以上是生活随笔為你收集整理的C++连接CTP接口实现简单量化交易(行情、交易、k线、策略)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    亚洲精品视频在线看 | 在线播放国产精品 | 国产成人精品一区二区三区 | 国产成人精品999在线观看 | 在线观看的av网站 | 成人a免费看 | 国产在线观看你懂的 | 久久99国产精品自在自在app | 在线观看视频精品 | 久久综合之合合综合久久 | 黄污视频大全 | 中文字幕在线观看的网站 | 国产露脸91国语对白 | 91桃色在线免费观看 | 国产高清一级 | 深爱激情久久 | 国产欧美综合在线观看 | 婷婷伊人五月 | 免费在线观看午夜视频 | 中文十次啦 | av一区二区在线观看中文字幕 | 欧美大片在线观看一区 | 成人宗合网 | 丁香视频免费观看 | 在线观看911视频 | 亚洲va韩国va欧美va精四季 | 国产精品永久免费在线 | 欧美一级视频免费 | 91精品久久久久久综合五月天 | av黄色在线观看 | 在线成人短视频 | 亚洲一区精品人人爽人人躁 | 免费a v视频 | 一区免费在线 | 天天操天天射天天爱 | 欧美日韩有码 | 久久欧美在线电影 | 婷婷中文字幕综合 | 97免费在线观看 | 99热播精品 | 高清久久久| 国产999视频在线观看 | 1024手机在线看 | 久久黄色片子 | 一区在线免费观看 | 国产亚洲精品日韩在线tv黄 | www日韩| 二区三区在线视频 | 4438全国亚洲精品在线观看视频 | 91看片在线看片 | 精品色999| 九九热只有精品 | 精品久久一区二区 | 欧美在线99 | 日韩欧美电影在线观看 | 在线成人性视频 | 最新中文字幕在线资源 | 中文字幕 国产视频 | 2019中文| 欧美日韩国产在线观看 | 超碰在线98 | 久久午夜色播影院免费高清 | 欧美性生爱 | 免费av在线播放 | 99精品色| 国产成人l区 | 国产大片黄色 | 国产精品久久久久影视 | 欧美精品久久久久久 | av电影免费在线播放 | 成人在线观看av | 天天伊人狠狠 | 少妇18xxxx性xxxx片| 欧美午夜久久 | 日本久久久久久 | 精品久久久久久亚洲综合网 | 日本不卡123区 | 欧美一二在线 | 天天综合网 天天综合色 | 天天干天天操天天搞 | 久草视频在线观 | 中文字幕精 | 人人插人人插 | 欧美日韩一区二区三区在线观看视频 | 天天干,天天射,天天操,天天摸 | 黄色成人影院 | 808电影免费观看三年 | 国内精品视频久久 | 久久精品久久99 | 国产福利免费看 | 欧美日韩在线观看一区 | 亚洲精品综合欧美二区变态 | 国产不卡一 | 激情五月婷婷丁香 | 国产精品美女久久久久久久久久久 | 国产在线观看中文字幕 | av成人在线电影 | 精品一区二区日韩 | 中文字幕第| 日韩av免费在线电影 | 美女网站黄在线观看 | 91三级在线观看 | 999色视频 | 免费精品视频在线观看 | 永久免费视频国产 | av专区在线 | 国产在线免费av | 精品久久久久久一区二区里番 | 久久久免费国产 | 欧美日韩调教 | 欧美日韩成人一区 | 国产麻豆视频免费观看 | 久草在线视频精品 | 成人av网页 | 国产在线日韩 | 国产色视频一区二区三区qq号 | 久久视影 | 免费看十八岁美女 | 中文字幕在线观看第一区 | 午夜av免费观看 | 又色又爽又激情的59视频 | 久久久久久久久久电影 | 日韩av不卡在线 | 欧美日韩精品免费观看视频 | 91在线91 | 麻豆视频免费在线播放 | 国精产品一二三线999 | 中文字幕成人网 | 日韩一区正在播放 | 国产成人精品在线播放 | 国产高清在线观看av | 一区 在线观看 | 日日操操操 | 久久久综合精品 | 久久影院一区 | 日韩大片在线看 | 色欧美日韩 | 精品一区二区三区香蕉蜜桃 | 蜜臀一区二区三区精品免费视频 | 成人9ⅰ免费影视网站 | 欧美极度另类性三渗透 | 天天操·夜夜操 | 国产天天综合 | 欧美孕妇视频 | 在线黄色国产 | 一级片免费观看视频 | 玖玖在线播放 | 亚洲影院国产 | 亚洲黄色在线播放 | 奇米网444 | 成人91免费视频 | 久久久久久免费视频 | 欧洲精品码一区二区三区免费看 | 亚洲精欧美一区二区精品 | 中文字幕色站 | 黄色动态图xx | 在线观看中文字幕一区 | 国产亚洲情侣一区二区无 | 免费在线视频一区二区 | 九九在线国产视频 | 天天射综合 | 久久福利影视 | 97精品国产91久久久久久 | 色夜影院 | 婷婷丁香社区 | 狠狠干狠狠色 | 国产高清成人在线 | 久久精品第一页 | 亚洲黄色片在线 | 成人久久综合 | 国产精品久久久久久久久久尿 | 激情文学综合丁香 | 午夜色性片 | 看污网站 | 国产精品2020| 国产精品一区二区三区在线 | 偷拍精偷拍精品欧洲亚洲网站 | 成人不用播放器 | 小草av在线播放 | 亚洲欧洲国产日韩精品 | 国产精品欧美久久久久天天影视 | 亚洲视频一区二区三区在线观看 | 国产精品一区二区视频 | 一本到在线 | 亚洲成人动漫在线观看 | 97在线观看免费高清完整版在线观看 | 国内久久看| 91成品视频 | 国产精品地址 | 久久综合色天天久久综合图片 | 欧美动漫一区二区三区 | 久久久久免费网站 | 91精品国产福利 | 成人丁香花 | 日韩最新av | 国产精品99久久久久久人免费 | 免费色婷婷 | 亚洲日本在线视频观看 | 日韩国产精品一区 | 夜色资源站国产www在线视频 | 久草免费福利在线观看 | 久久成人在线视频 | 欧美日韩国产一区二区三区在线观看 | 日韩av不卡在线观看 | 韩日精品在线 | 91久久影院 | 日日干天天| 亚洲一区 影院 | 日韩电影在线观看一区二区 | 免费观看视频的网站 | 中文av在线免费观看 | 91福利影院在线观看 | 色网站免费在线观看 | 在线视频欧美精品 | 欧美久久久久久久久久久 | 色婷婷一区 | 蜜桃av人人夜夜澡人人爽 | 999ZYZ玖玖资源站永久 | 免费精品久久久 | 九九九九九九精品任你躁 | 精品亚洲免费视频 | 九七视频在线观看 | www.黄色片.com | 日黄网站 | 日韩精品中文字幕在线不卡尤物 | 97网站| 伊人天天干 | 激情久久久久久久久久久久久久久久 | 波多野结衣在线观看视频 | 伊人热 | 久久在现 | 91最新在线观看 | 在线看片视频 | 黄色午夜网站 | 国产精品麻豆欧美日韩ww | 中文字幕精品一区二区三区电影 | 日本精品久久久一区二区三区 | 欧美日韩免费在线观看视频 | 国产成人精品久久久久 | 欧美a√大片 | 免费视频一二三 | 亚洲伊人婷婷 | 激情网站免费观看 | 欧美 日韩 成人 | av片一区| 99视频免费观看 | 二区精品视频 | 亚洲资源| avav片 | 久久精品一 | 成人黄色在线播放 | 久久久久久黄色 | 亚洲精品av在线 | 99av在线视频 | 黄色亚洲 | 美女天天操 | 精品中文字幕在线观看 | 久久国产女人 | 欧美成人h版在线观看 | 一区二区三区在线免费播放 | 日韩欧美在线综合网 | 欧洲精品久久久久毛片完整版 | 亚洲第一久久久 | 国产一级免费电影 | 五月天激情视频 | 九色视频网址 | 99精品视频免费看 | 免费av网址在线观看 | 中文字幕资源网 国产 | 麻豆视频在线看 | 成人精品亚洲 | 中文字幕免 | 亚洲少妇久久 | 日韩中文字幕在线不卡 | 五月天综合网站 | 少妇bbw搡bbbb搡bbbb | 久久免费播放视频 | 黄在线| 欧美一级片 | 99久久精品无免国产免费 | 黄色a一级视频 | 人人插人人舔 | 国产色婷婷精品综合在线手机播放 | 久久永久视频 | 99久久精品国产系列 | 国产在线久久久 | 亚洲乱码精品 | 成人影视免费看 | 欧美成人999| 国产精品网在线观看 | 91久久奴性调教 | 国产精品综合在线 | 日韩视频在线观看视频 | 99久久精品国产系列 | 久久dvd | 免费www视频 | 天天透天天插 | 在线成人一区 | 国产精品96久久久久久吹潮 | 国产高h视频 | 久久中文字幕在线视频 | 国产视频高清 | 91视频在线免费下载 | 中文av免费| 欧美日韩免费观看一区=区三区 | 日韩激情一二三区 | 麻豆一精品传二传媒短视频 | av网站在线观看播放 | 女人久久久久 | 成人免费视频a | 91秒拍国产福利一区 | 热久久这里只有精品 | 国产99久久久国产精品免费二区 | 久草精品视频在线观看 | 免费成人黄色 | 婷婷综合导航 | 黄色91在线观看 | 国产精品成人一区二区三区 | 国产 一区二区三区 在线 | 91在线视频| 69欧美视频| 亚洲一区视频在线播放 | 亚洲视频在线视频 | 热久久免费视频 | 日本护士三级少妇三级999 | 99久精品 | 国产日韩在线视频 | 亚洲色综合 | 婷婷丁香社区 | 免费中文字幕在线观看 | 在线不卡中文字幕播放 | 中文字幕二区三区 | 日本在线观看一区二区 | 亚洲乱码精品久久久久 | 欧美一级性生活 | 国产精品对白一区二区三区 | 日韩av视屏在线观看 | 911久久| 操操操干干干 | 精品一区二区在线免费观看 | 色欲综合视频天天天 | 国产区在线视频 | 麻豆系列在线观看 | 一区二区三区在线影院 | 免费看的黄色录像 | 深爱激情综合网 | 国产视频导航 | 国产精品久久久久久久久久久久久久 | 中文av不卡 | 欧美日韩视频一区二区三区 | 五月婷婷综合激情 | 国产欧美在线一区二区三区 | 国产91九色视频 | 91在线中文 | 国产免费午夜 | 婷婷 中文字幕 | 97在线视频免费观看 | 国产精品久久久久久av | 日韩精品一区电影 | 我要色综合天天 | 精品视频成人 | 久碰视频在线观看 | 天堂av影院 | 日韩精品免费一区二区 | 狠狠久久伊人 | 91九色成人蝌蚪首页 | av免费观看在线 | 99视频在线免费 | 91免费视频网站在线观看 | 麻豆免费精品视频 | av电影亚洲 | 三级av黄色| 久草在线免费资源 | 天天操天天射天天爱 | 五月婷婷中文网 | 18久久久久久 | 少妇视频一区 | 天天做日日做天天爽视频免费 | 日韩一区正在播放 | 中文字幕五区 | 久久视频在线观看免费 | av免费看在线 | 国产视频久久久久 | 亚州精品国产 | 99999精品视频 | 国产精品99久久99久久久二8 | 999在线精品 | 成人a免费 | 久久久免费电影 | 国产福利精品在线观看 | 亚洲伊人成综合网 | 99一级片 | 日韩午夜高清 | 婷婷色六月天 | 麻豆视频在线播放 | 激情视频一区二区 | 成人久久精品视频 | 日一日操一操 | 爱爱av网站 | 福利电影久久 | 五月天亚洲精品 | 青青草久草在线 | 欧美一级特黄高清视频 | 丁香婷婷综合色啪 | 日韩黄色大片在线观看 | 免费日韩一区二区三区 | 在线观看久草 | av电影在线观看 | 精品嫩模福利一区二区蜜臀 | 在线观看的a站 | 欧美极品少妇xxxxⅹ欧美极品少妇xxxx亚洲精品 | 亚洲综合欧美精品电影 | a爱爱视频 | h视频在线看 | 日韩专区 在线 | 91av中文字幕 | 中文一区二区三区在线观看 | 成人av片免费观看app下载 | 欧美另类一二三四区 | 99色人 | 欧美精品做受xxx性少妇 | 免费日韩高清 | 一级久久精品 | 日韩成年视频 | 99久久999久久久精玫瑰 | 欧美日韩3p | 日本精品视频在线观看 | 国内精品中文字幕 | 亚洲精品乱码久久久久久蜜桃91 | 国产又粗又猛又爽又黄的视频先 | 91爱看片 | 午夜精品久久久久久久99 | 欧美男同网站 | 日韩手机视频 | 在线播放日韩av | 日本在线中文 | 狠狠色丁香婷综合久久 | 国产在线播放观看 | 国产精品美女久久久久久 | 在线观看91av | 精品1区二区 | 九九三级毛片 | 精品一二三区 | 99国产精品一区 | www..com毛片| 亚洲精品美女久久久 | 最新超碰在线 | 国产成人久久精品亚洲 | 91久久偷偷做嫩草影院 | 欧美成人中文字幕 | 亚洲国产操 | 天天操天天射天天爽 | 国产午夜精品免费一区二区三区视频 | 日日操操 | 三级av中文字幕 | 日本99热 | 一区二区三区动漫 | 亚洲在线高清 | 91丨porny丨九色 | 久久999久久 | 国产精品久久免费看 | 欧美成人91| 日日夜夜精品视频天天综合网 | 久久久www成人免费毛片麻豆 | 国产视频精品久久 | 色狠狠一区二区 | 青春草免费视频 | 免费网站色 | 国产少妇在线观看 | 久久亚洲国产精品 | 97在线视频免费 | 国产xxxx性hd极品 | 国产精品一区二区免费 | 在线天堂中文www视软件 | 亚洲a在线观看 | 色激情五月 | 综合色爱| 国产69精品久久99不卡的观看体验 | 久久久久成 | 亚洲a网| 亚洲精品99久久久久中文字幕 | 黄色aa久久 | 免费看搞黄视频网站 | 久久99视频免费 | 成人免费视频免费观看 | 国产免费大片 | 久久久久日本精品一区二区三区 | 少妇性xxx | 欧美做受高潮 | 日本三级久久 | 亚洲成人免费在线观看 | 人人草在线视频 | 免费精品 | 91激情在线视频 | 亚洲一区二区视频 | 99精品免费久久久久久久久 | 中文电影网 | 青青草国产在线 | 免费国产一区二区视频 | 欧美精品一区在线发布 | 韩国精品福利一区二区三区 | 91传媒免费观看 | 91高清免费观看 | 91精品视频在线 | 国产黄色精品视频 | 色综合亚洲精品激情狠狠 | 91色视频| 欧美日韩国产色综合一二三四 | 国产精品美女久久久久久久 | 九九九九九九精品任你躁 | av九九 | 91看片在线播放 | 九色视频网 | 五月婷婷毛片 | 国产精品一区二区久久 | 午夜电影 电影 | 午夜视频色 | 91热视频在线观看 | 中文字幕资源网在线观看 | 成人h在线播放 | 九色琪琪久久综合网天天 | 中文字幕影视 | 久久夜色网 | 成年人在线视频观看 | 婷婷在线综合 | 午夜精品福利在线 | 天堂av免费 | 欧美日韩高清免费 | 欧美精品乱码久久久久久按摩 | 色婷在线 | 四虎欧美 | 免费看国产视频 | 色综合久久精品 | 香蕉久久久久 | 视频91在线| 91视频网址入口 | 黄色www在线观看 | 97在线观看免费 | 欧美日韩国产精品一区 | 色综合久久88色综合天天6 | 国产在线视频在线观看 | 午夜影院在线观看18 | 天天操天天干天天综合网 | 97色狠狠| 国产精品欧美久久久久三级 | 99热精品视| 国产原创av片 | 欧美一级专区免费大片 | 欧美日韩高清在线 | 国产一区二区不卡视频 | 一区二区视频欧美 | 黄色一级免费网站 | 欧美极品久久 | 久久久午夜精品理论片中文字幕 | 成人动漫视频在线 | www.狠狠色 | 九九热视频在线免费观看 | 香蕉在线视频播放网站 | 天天干天天拍 | 国产成人久久av免费高清密臂 | 99精品电影 | 伊人网站 | 亚洲欧美日韩国产一区二区 | 成人蜜桃视频 | 人人澡人人爽欧一区 | 色资源二区在线视频 | 色资源在线 | 国产伦精品一区二区三区无广告 | 少妇视频在线播放 | 久久免费精彩视频 | 国产精品久久久久久久久久久杏吧 | 国产成人黄色av | 久久免费视频在线观看30 | 国产精品久久久久久久免费大片 | 日韩理论| 成人av一区二区三区 | 免费人人干 | 又湿又紧又大又爽a视频国产 | 国产一区二区网址 | 日本中文在线播放 | 婷婷六月中文字幕 | 亚洲欧美精品在线 | 最近中文字幕高清字幕在线视频 | 中文视频一区二区 | 91精品国产自产在线观看 | 久久国产精品成人免费浪潮 | 成年人在线播放视频 | www.888.av| 免费不卡中文字幕视频 | 99视频久久 | 久久新 | 国产精品精品 | 成人激情开心网 | 欧美激情视频一二区 | 亚洲精品在线观看网站 | 玖玖视频精品 | 懂色av一区二区在线播放 | 国产精品系列在线观看 | 天天色天天草天天射 | aaaaaa毛片| 韩日视频在线 | 丝袜av一区| 在线观看国产一区 | 毛片区 | 国产色资源 | 超碰国产在线 | 久久久久久久久久久久久9999 | 天天操天天添 | 午夜av电影院 | 日韩一区二区三区高清在线观看 | 亚洲午夜电影网 | av线上看| 久久成人人人人精品欧 | 天天射天天干天天操 | 日韩在线高清视频 | 六月丁香激情综合色啪小说 | 一区二区三区中文字幕在线观看 | 国产视频日韩视频欧美视频 | 精品欧美小视频在线观看 | 日本少妇久久久 | 欧美午夜激情网 | 精品久久一区二区三区 | 韩日成人av | 欧美成人中文字幕 | 伊人天天狠天天添日日拍 | 色噜噜狠狠狠狠色综合 | 色综合天天狠天天透天天伊人 | 国产精品福利无圣光在线一区 | 亚洲天天综合网 | 99视频在线精品国自产拍免费观看 | 久精品在线观看 | 91精品久久久久久久99蜜桃 | 五月综合激情网 | 国产高清精品在线 | 一区二区三区免费网站 | 国产一区二区不卡视频 | 久久蜜臀一区二区三区av | 五月花激情 | 日本中文在线播放 | 手机看片国产 | 精品美女久久久久 | 日本二区三区在线 | 婷婷综合久久 | 久久免费成人网 | 一区二区三区在线免费观看视频 | 国产亚洲视频在线 | 亚洲欧洲一区二区在线观看 | 日韩三级视频在线观看 | 在线免费观看羞羞视频 | 四虎在线免费视频 | 97电影手机| 久久精品久久99 | 免费看黄在线网站 | 久草网站 | 国产精品久久av | 国产麻豆精品一区 | 丁香花五月 | 日本黄色免费播放 | 亚洲成色777777在线观看影院 | 热久久99这里有精品 | 欧美精品乱码99久久影院 | 久久综合偷偷噜噜噜色 | 日韩精品免费一线在线观看 | av在线观 | 色999视频| 久久私人影院 | 西西4444www大胆无视频 | 91麻豆.com| 午夜av在线播放 | 久久黄视频| 久久精品日本啪啪涩涩 | 国产一级黄色片免费看 | 国产三级精品在线 | 成人黄色视 | 国产一区二区三区高清播放 | 人人插人人干 | 日韩午夜在线播放 | 高清在线一区 | 色吊丝av中文字幕 | 成人在线视频免费观看 | 蜜臀av性久久久久av蜜臀妖精 | 99热手机在线观看 | 最新av在线播放 | 亚洲区视频在线 | 在线电影 一区 | 日韩亚洲在线视频 | 毛片无卡免费无播放器 | 亚洲天堂网视频在线观看 | 特级毛片在线 | 五月婷婷在线综合 | 美女网站免费福利视频 | 国产成人精品免高潮在线观看 | 日本久久高清视频 | 在线视频 区| 成人网页在线免费观看 | 日韩高清一区二区 | 国产成人精品在线 | 久久久久久免费 | 手机av资源| 97品白浆高清久久久久久 | 国产麻豆精品传媒av国产下载 | 国产99精品在线观看 | 亚洲一区尤物 | 500部大龄熟乱视频使用方法 | 精品一区二区在线免费观看 | 国产一级黄色av | 五月激情丁香图片 | 97免费视频在线播放 | av线上免费观看 | 免费av在线网 | 99视频国产在线 | 天天色天天骑天天射 | 精品国产亚洲一区二区麻豆 | 99视频在线精品免费观看2 | 国产精品青青 | 精品在线免费视频 | 97免费| 欧美日韩国产一区 | 久久精品国产精品亚洲精品 | 国产一级大片在线观看 | 日本一区二区不卡高清 | 天天天在线综合网 | 夜夜婷婷 | 狠狠色香婷婷久久亚洲精品 | 97色噜噜 | 久久影视网| 欧美小视频在线观看 | 97av视频| 亚洲深爱激情 | 久久亚洲综合国产精品99麻豆的功能介绍 | 国产尤物一区二区三区 | 99在线观看免费视频精品观看 | 国产91在线免费视频 | 黄色软件视频大全免费下载 | 久草在线最新视频 | 国产精品18久久久久久久网站 | 精品国产诱惑 | 成人av影院在线观看 | 久久视频这里有久久精品视频11 | 精品美女国产在线 | 成人精品国产 | 中文字幕在线观看视频网站 | 久久免费在线观看视频 | 深夜国产福利 | 成年人免费电影 | 中文字幕国产精品一区二区 | 欧美日本啪啪无遮挡网站 | 成人午夜电影久久影院 | 欧洲黄色片| 亚洲电影黄色 | 日韩精品在线一区 | 久久精品激情 | 正在播放亚洲精品 | 国精产品999国精产品岳 | 大型av综合网站 | 99视频在线 | 色爱区综合激月婷婷 | 中文一区二区三区在线观看 | 国产高清不卡av | 国产午夜精品一区 | 日韩一级片大全 | 日韩高清不卡一区二区三区 | 黄色成人在线观看 | 91麻豆国产福利在线观看 | 99精品久久99久久久久 | 91精选在线观看 | 亚洲综合激情小说 | www久久精品| 国产在线观看污片 | 91日韩在线视频 | 欧美爽爽爽 | 欧美激情精品久久久久 | 国产韩国日本高清视频 | 日韩理论在线视频 | 99资源网 | 国产一区欧美一区 | 波多野结依在线观看 | 国产九九九视频 | 99精品一区二区 | 日韩在线免费播放 | 日韩精品一区二区三区免费观看视频 | 婷婷伊人五月 | 中文字幕日韩电影 | 久久久久久久毛片 | 国产小视频在线观看免费 | 色视频在线免费 | 中文字幕av全部资源www中文字幕在线观看 | 久久久综合香蕉尹人综合网 | 日韩在线欧美在线 | 精品一区二区日韩 | 国色天香av | 日韩理论片在线 | 欧美高清视频不卡网 | 全久久久久久久久久久电影 | 亚洲成人黄色在线观看 | 久久久久免费观看 | 在线观看视频一区二区三区 | 国产永久免费高清在线观看视频 | 国产精品一区二区精品视频免费看 | 一区 二区 精品 | 久久系列 | 亚洲年轻女教师毛茸茸 | 天天色视频| 中文字幕精品www乱入免费视频 | 久久伊人八月婷婷综合激情 | 久久精品欧美 | 国产黄a三级三级三级三级三级 | 99久久久国产精品免费99 | 日本三级吹潮在线 | 亚洲精品免费播放 | 91视频亚洲 | 亚洲欧美精品一区 | 香蕉在线播放 | 国产综合91| 在线观看视频你懂得 | 久久久久久久久久久精 | 欧美一区二区三区在线视频观看 | 久久高清av| 园产精品久久久久久久7电影 | 成人av在线亚洲 | 日韩av免费在线电影 | 久久精品第一页 | 色在线高清 | 久久久精品免费观看 | 国产理论在线 | 大型av综合网站 | 国产麻豆精品一区二区 | 亚洲va欧洲va国产va不卡 | 亚洲免费av网站 | 久草在线资源视频 | 久久爱影视i | 久久久久亚洲精品成人网小说 | 亚洲精品国偷拍自产在线观看蜜桃 | 久久免费大片 | 91精品国产成人观看 | 婷婷六月天综合 | 亚洲成人高清在线 | 亚洲精品高清在线 | 狠狠狠色丁香婷婷综合激情 | 国产四虎影院 | 免费网址在线播放 | 成在人线av | 久久无码av一区二区三区电影网 | 亚洲日本精品 | 久久久精品一区二区三区 | 国产乱码精品一区二区三区介绍 | 天天插综合 | 亚洲欧洲精品一区二区 | 91一区二区三区久久久久国产乱 | 99热国产精品 | 亚洲精品一区二区三区在线观看 | 色在线高清 | 中文字幕一区二区三 | 日日夜夜天天久久 | 国产天天爽 | 日韩精品一区二区三区水蜜桃 | 国产精品亚州 | 国产视频一区二区在线播放 | 亚洲综合欧美激情 | 西西www4444大胆在线 | 精品久久久久久久久久久久久久久久久久 | 色网影音先锋 | 99精品视频免费看 | 精品久久久久久久久久久久 | 国产精品一区二区av日韩在线 | 亚洲欧洲日韩在线观看 | 三上悠亚在线免费 | 激情视频综合网 | 国产一区二区久久久久 | 美女视频黄是免费的 | 亚洲最大av网站 | 久草免费在线观看 | 免费69视频 | 免费看片网站91 | 婷婷丁香七月 | 欧美ⅹxxxxxx | 涩涩网站在线观看 | x99av成人免费 | 日韩专区在线 | www.69xx| 88av视频| 狠狠干美女 | 国产精品亚洲综合久久 | 久久97视频 | 久久在线观看 | 99国产精品久久久久老师 | 天天激情站 | 91免费试看| 激情欧美网 | 蜜臀91丨九色丨蝌蚪老版 | 国产黄网在线 | 国产亚洲视频在线观看 | 激情喷水 | 天天操天天草 | 国产美女久久 | 天天操天天拍 | 免费在线国产精品 | 在线观看免费av网站 | 天海翼一区二区三区免费 | 精品久久久久久久久中文字幕 | 在线亚洲观看 | 欧美日韩午夜爽爽 | 日韩av成人| 欧美日韩一区二区三区在线免费观看 | 久久国产精品99国产 | 久久国产精品99久久久久久老狼 | 婷婷六月中文字幕 | 福利一区二区 | 中文字幕一区三区 | 热久久这里只有精品 | av亚洲产国偷v产偷v自拍小说 | 日韩v在线 | 欧美 日韩 国产 成人 在线 | 国产18精品乱码免费看 | 欧美精品免费一区二区 | 婷婷四房综合激情五月 | 五月婷婷激情五月 | 国产精品mv | 亚洲五月综合 | 中文字幕日本在线观看 | 国产高清日韩 | 久av电影| 天堂av免费 | 手机在线日韩视频 | 美女免费视频网站 | 亚洲人成人在线 | 久草视频看看 | 久草青青在线观看 | 国产精品69av | 久久在线视频在线 | 深爱激情综合 | 在线直播av | 精品视频资源站 | 98超碰在线 | 成人中文字幕在线 | 精品国产一区二区三区久久久久久 | 国产精品久久久久永久免费 | a级片在线播放 | 色综合人人 | 国产美女主播精品一区二区三区 | 在线视频 一区二区 | 久久人91精品久久久久久不卡 | 国内精品久久久久 | 一区二区 精品 | 国产精品免费一区二区 | 波多野结衣视频一区二区三区 | 久久免费福利 | 综合久久久久久久 | 日韩一级片观看 | 99热超碰 | 免费在线观看黄色网 | 国产精品1区2区 | 九九热免费视频在线观看 | 欧美国产不卡 | 久久久精品国产一区二区电影四季 | 婷婷激情影院 | 免费看av在线 | www.激情五月.com | 婷婷精品在线视频 | 成人av在线直播 | 亚洲午夜不卡 | 国产精品女同一区二区三区久久夜 | 久久综合九色九九 | 欧美成人按摩 | 亚洲综合精品在线 | 97天堂网 | 日韩网站在线看片你懂的 | 国产精品久久久久久久久久久久午夜片 | 在线中文字幕一区二区 | 国产精品嫩草影院123 | 亚洲国产精彩中文乱码av | 在线免费黄色片 | av大片免费在线观看 | 亚洲欧美日韩精品久久久 | 女人高潮特级毛片 | 六月丁香综合 | 久久久久久久久久影视 | 成年人免费电影在线观看 | 日本激情中文字幕 | 久久精品香蕉视频 | 97国产大学生情侣酒店的特点 | 国产69精品久久久久99尤 | 精品99在线视频 | 探花视频在线版播放免费观看 | 欧美久久九九 | 狠狠躁天天躁综合网 | 久久久精品欧美一区二区免费 | 91视频免费国产 | 欧美了一区在线观看 | 久草视频免费在线观看 | 国产亚洲精品久久久网站好莱 | 五月激情丁香图片 | 中文字幕色在线 | 色网av | 国产手机在线精品 | 在线观看国产麻豆 | 久久国产日韩 | 日韩国产在线观看 |