易得程序化交易技术论坛

登录 | 注册

积分: 0 |用户组: 游客

搜索
查看: 348|回复: 5

易得开放交易可编程接口

[复制链接]

23

主题

68

帖子

1620

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1620
发表于 7 天前 | 显示全部楼层 |阅读模式
易得V3.3.2版本推出了开放交易可编程接口,可以通过C++编程轻松对接用户的交易程序。从而实现易得的多种交易方式,包括手工交易、预警信号交易、股票池出入池交易,图表程序化交、后台程序化交易。

也是就说,易得程序的所有下单指令都会发送到一个接口函数,在接口函数中您可以自由实现指令处理。也支持持仓、资金等各种查询函数,实现全方位的交易接口对接。

一,软件的交易功能介绍

登录交易

1.png

2.png

交易栏

3.png


开放接口指令测试日志打印窗口:

4.png

预警信号下单:

5.png

股票池入池出池下单:

6.png

图表程序化下单:

7.png

后台程序化交易:

8.png

二,开放接口使用说明

易得开放接口是一个高仿CTP期货交易综合平台的接口,无论您是否对接过CTP,都可以轻松实现对接。

1,在易得安装目录找到OpenTraderApi.rar,或下载 OpenTraderApi.rar (68.3 KB, 下载次数: 29)
解压到一个目录下,如F:\OpenTraderApi

9.png

2,打开下一级OpenTraderApi目录,双击OpenTraderApi.sln启动VS编程IDE环境,可使用VS2010以上版本。

10.png

3,在编程环境中打开工程的Trader/MsOpenTraderApi.cpp文件。

11.png

4,参考示例根据自己的需求改写以下函数:

// 连接
BOOL CMsOpenTraderApi::Connect(char* lpszFrontAddr, char* lpszBrokerID, char* lpszInvestorID, char* lpszPassword, int nTradeDate /*= 0*/)

// 登录
int CMsOpenTraderApi::ReqUserLogin(char* lpszBrokerID, char* lpszInvestorID, char* lpszPassword)

// 退出
int CMsOpenTraderApi::ReqUserLogout()

// 请求查询投资者
int CMsOpenTraderApi::ReqQryInvestor()

// 请求查询资金账户
int CMsOpenTraderApi::ReqQryTradingAccount()

// 请求查询投资者持仓
int CMsOpenTraderApi::ReqQryInvestorPosition()

// 请求查询报单
int CMsOpenTraderApi::ReqQryOrder()

// 请求查询成交
int CMsOpenTraderApi::ReqQryTrade()

// 报单录入请求
int CMsOpenTraderApi::ReqOrderInsert(const char* lpszExchangeID, const char* lpszInstrument, double dPrice, int nVol, char cOrderPriceType, char cDirection, char cCombOffsetFlag, char cCombHedgeFlag, double dStopPrice /*= 0*/)

// 报单操作请求 (撤单)
int CMsOpenTraderApi::ReqOrderAction(const char* lpszOrderSysID, const char* lpszExchangeID, const char* lpszInstrumentID)

// 查询最大报单数量请求

int CMsOpenTraderApi::ReqQueryMaxOrderVolume(const char* lpszInstrument, char cDirection, char cOffsetFlag, char cHedgeFlag)

5,开发调试完成后,编译Release版本工程,注意如果安装的易得程序是64位,请选择64位编译;如安装的易得是32位程序,请选择32位编译。

12.png

6,编译成功后,将生成的OpenTraderApi.dll文件拷贝覆盖到易得的安装目录(易得主程序MagicStk.exe的同级目录),易得就可以调用您自己开发的交易接口程序了。

假设接口工程放在F:\OpenTraderApi目录。生成的各种版本的OpenTraderApi.dll所在:
64Release:  F:\OpenTraderApi\out\bin64\Release\OpenTraderApi.dll
64Debug:  F:\OpenTraderApi\out\bin64\Debug\OpenTraderApi.dll
32Release:  F:\OpenTraderApi\out\bin32\Release\OpenTraderApi.dll
32Debug:  F:\OpenTraderApi\out\bin32\Debug\OpenTraderApi.dll

7,大功告成。

附 MsOpenTraderApi.cpp 源码:

  1. #include "StdAfx.h"
  2. #include "MsOpenTraderApi.h"
  3. int CMsOpenTraderApi::m_nOrderRef = 1;

  4. //////////////////////////////////////////////////////////////////////////////////////////////////////////
  5. //////////////////////////////////////////////////////////////////////////////////////////////////////////
  6. // 开发者请根据自己的应用改写以下交易接口函数

  7. // 连接
  8. BOOL CMsOpenTraderApi::Connect(char* lpszFrontAddr, char* lpszBrokerID, char* lpszInvestorID, char* lpszPassword, int nTradeDate /*= 0*/)
  9. {
  10.     // 接口开发者可自行在此做些接口连接工作

  11.     SendNotifyMessage(TRADE_TYPE_CONNECT);  // 返回连接成功通知易得, 必须
  12.     ReqUserLogin(lpszBrokerID, lpszInvestorID, lpszPassword);   // 连接成功后马上发起登录请求, 必须

  13.     return TRUE;
  14. }

  15. // 登录
  16. int CMsOpenTraderApi::ReqUserLogin(char* lpszBrokerID, char* lpszInvestorID, char* lpszPassword)
  17. {
  18.     // 接口开发者可自行在此做些接口登录工作

  19.     SendNotifyMessage(TRADE_TYPE_LOGIN);    // 返回登录成功通知易得, 必须

  20.     return 0;
  21. }

  22. // 退出
  23. int CMsOpenTraderApi::ReqUserLogout()
  24. {
  25.     // 接口开发者可自行在此做些接口退出工作

  26.     SendNotifyMessage(TRADE_TYPE_LOGOUT);    // 返回退出成功通知易得, 必须

  27.     return 0;
  28. }

  29. // 请求查询投资者
  30. int CMsOpenTraderApi::ReqQryInvestor()
  31. {
  32.     // 此处可返回投资者信息名称,可自行修改。
  33.     SendNotifyMessage(TRADE_TYPE_RSPINVESTOR, TRUE, (WPARAM)"我是股神");    // 返回账户名称

  34.     return 0;
  35. }

  36. // 请求查询资金账户
  37. int CMsOpenTraderApi::ReqQryTradingAccount()
  38. {
  39.     // 可自行修改资金账户,并返回通知到易得。

  40.     WriteBlackCon("开放交易接口收到请求查询资金账户,请自行修改资金账户数据!\r\n"); // 此行可删除

  41.     CMstTradingAccountField ta;
  42.     memset(&ta, 0, sizeof(CMstTradingAccountField));

  43.     strncpy_s(ta.AccountID, "", _TRUNCATE); // 投资者帐号
  44.     ta.Available = 1000000;     // 可用资金
  45.     ta.WithdrawQuota = 1000000; // 可取资金
  46.     ta.FrozenCash = 0;          // 冻结的资金

  47.     // 以下字段为次要信息,可返回0,或仅期货类有用
  48.     ta.PreDeposit = 0;          // 上次存款额
  49.     ta.PreMargin = 0;           // 上次占用的保证金
  50.     ta.CloseProfit = 0;         // 平仓盈亏
  51.     ta.CurrMargin = 0;          // 占用保证金
  52.     ta.Commission = 0;          // 手续费
  53.     ta.Deposit = 0;             // 今日入金
  54.     ta.Withdraw = 0;            // 今日出金

  55.     SendNotifyMessage(TRADE_TYPE_RSPTRADINGACCOUNT, TRUE, (WPARAM)&ta);

  56.     return 0;
  57. }

  58. // 请求查询投资者持仓
  59. int CMsOpenTraderApi::ReqQryInvestorPosition()
  60. {
  61.     // 可自行修改投资者持仓,并返回通知到易得。

  62.     WriteBlackCon("开放交易接口收到请求查询投资者持仓,请自行修改资金账户数据!\r\n"); // 此行可删除

  63.     {
  64.         CMstInvestorPositionField pos;
  65.         memset(&pos, 0, sizeof(CMstInvestorPositionField));
  66.         strncpy_s(pos.InvestorID, "", _TRUNCATE);
  67.         strncpy_s(pos.InstrumentID, "SH.600000", _TRUNCATE);
  68.         pos.Position = 500;      // 总持仓
  69.         pos.YdPosition = 200;    // 上日持仓
  70.         pos.TodayPosition = pos.Position - pos.YdPosition;  // 今日持仓
  71.         pos.PositionCost = 8.26 * pos.Position;
  72.         pos.OpenCost = pos.PositionCost;
  73.         pos.PosiDirection = MST_PD_Long;
  74.         SendNotifyMessage(TRADE_TYPE_RSPINVESTORPOSITION, FALSE, (WPARAM)&pos);  // 只能一条一条通知,最后一条的bIsLast参数必须为TRUE
  75.     }
  76.     {
  77.         CMstInvestorPositionField pos;
  78.         memset(&pos, 0, sizeof(CMstInvestorPositionField));
  79.         strncpy_s(pos.InvestorID, "", _TRUNCATE);
  80.         strncpy_s(pos.InstrumentID, "SZ.000001", _TRUNCATE);
  81.         pos.Position = 800;      // 总持仓
  82.         pos.YdPosition = 300;    // 上日持仓
  83.         pos.TodayPosition = pos.Position - pos.YdPosition;  // 今日持仓
  84.         pos.PositionCost = 9.16 * pos.Position;
  85.         pos.OpenCost = pos.PositionCost;
  86.         pos.PosiDirection = MST_PD_Long;
  87.         SendNotifyMessage(TRADE_TYPE_RSPINVESTORPOSITION, TRUE, (WPARAM)&pos);  // 只能一条一条通知,最后一条的bIsLast参数必须为TRUE
  88.     }

  89.     return 0;
  90. }

  91. // 请求查询报单
  92. int CMsOpenTraderApi::ReqQryOrder()
  93. {
  94.     // 可自行修改查询报单,并返回通知到易得。

  95.     WriteBlackCon("开放交易接口收到请求查询报单,请自行修改!\r\n"); // 此行可删除

  96.     {
  97.         CMstOrderField order;
  98.         memset(&order, 0, sizeof(CMstOrderField));
  99.         strncpy_s(order.InsertDate, "20250205", _TRUNCATE); // 报单日期
  100.         strncpy_s(order.InsertTime, "110835", _TRUNCATE);   // 委托时间
  101.         strncpy_s(order.InvestorID, "", _TRUNCATE);
  102.         strncpy_s(order.InstrumentID, "SH.600016", _TRUNCATE);
  103.         order.OrderPriceType = MST_OPT_LimitPrice;          // 限价
  104.         order.Direction = MST_D_Buy;                        // MST_D_Buy 买入;MST_D_Sell 卖出
  105.         order.OrderStatus = MST_OST_AllTraded;              // 全部成交
  106.         order.VolumeTotalOriginal = 200;                    // 报单数量
  107.         order.LimitPrice = 20.0;                            // 报单价格
  108.         order.VolumeTraded = 200;                           // 成交数量
  109.         strncpy_s(order.OrderSysID, "100", _TRUNCATE);      // 报单号(必须唯一不可重复)
  110.         strncpy_s(order.OrderRef, order.OrderSysID, _TRUNCATE);
  111.         order.RequestID = 100;                              // 请求号
  112.         SendNotifyMessage(TRADE_TYPE_RSPORDER, FALSE, (WPARAM)&order); // 只能一条一条通知,最后一条的bIsLast参数必须为TRUE
  113.     }
  114.     {
  115.         CMstOrderField order;
  116.         memset(&order, 0, sizeof(CMstOrderField));
  117.         strncpy_s(order.InsertDate, "20250405", _TRUNCATE); // 报单日期
  118.         strncpy_s(order.InsertTime, "140835", _TRUNCATE);   // 委托时间
  119.         strncpy_s(order.InvestorID, "", _TRUNCATE);
  120.         strncpy_s(order.InstrumentID, "SH.600036", _TRUNCATE);
  121.         order.OrderPriceType = MST_OPT_LimitPrice;          // 限价
  122.         order.Direction = MST_D_Sell;                        // MST_D_Buy 买入;MST_D_Sell 卖出
  123.         order.OrderStatus = MST_OST_AllTraded;              // 全部成交
  124.         order.VolumeTotalOriginal = 300;                    // 报单数量
  125.         order.LimitPrice = 20.0;                            // 报单价格
  126.         order.VolumeTraded = 300;                           // 成交数量
  127.         strncpy_s(order.OrderSysID, "100", _TRUNCATE);      // 报单号(必须唯一不可重复)
  128.         strncpy_s(order.OrderRef, order.OrderSysID, _TRUNCATE);
  129.         order.RequestID = 100;                              // 请求号
  130.         SendNotifyMessage(TRADE_TYPE_RSPORDER, FALSE, (WPARAM)&order); // 只能一条一条通知,最后一条的bIsLast参数必须为TRUE
  131.     }
  132.     {
  133.         CMstOrderField order;
  134.         memset(&order, 0, sizeof(CMstOrderField));
  135.         strncpy_s(order.InsertDate, "20250405", _TRUNCATE); // 报单日期
  136.         strncpy_s(order.InsertTime, "140835", _TRUNCATE);   // 委托时间
  137.         strncpy_s(order.InvestorID, "", _TRUNCATE);
  138.         strncpy_s(order.InstrumentID, "SH.600048", _TRUNCATE);
  139.         order.OrderPriceType = MST_OPT_LimitPrice;          // 限价
  140.         order.Direction = MST_D_Buy;                        // MST_D_Buy 买入;MST_D_Sell 卖出
  141.         order.OrderStatus = MST_OST_NoTradeQueueing;        // 未成交,可撤单。 部分成交使用: MST_OST_PartTradedQueueing
  142.         order.VolumeTotalOriginal = 300;                    // 报单数量
  143.         order.LimitPrice = 20.0;                            // 报单价格
  144.         order.VolumeTraded = 300;                           // 成交数量
  145.         strncpy_s(order.OrderSysID, "100", _TRUNCATE);      // 报单号(必须唯一不可重复)
  146.         strncpy_s(order.OrderRef, order.OrderSysID, _TRUNCATE);
  147.         order.RequestID = 100;                              // 请求号
  148.         SendNotifyMessage(TRADE_TYPE_RSPORDER, TRUE, (WPARAM)&order); // 只能一条一条通知,最后一条的bIsLast参数必须为TRUE
  149.     }
  150.     return 0;
  151. }

  152. // 请求查询成交
  153. int CMsOpenTraderApi::ReqQryTrade()
  154. {
  155.     // 可自行修改查询成交,并返回通知到易得。

  156.     WriteBlackCon("开放交易接口收到请求查询成交,请自行修改!\r\n"); // 此行可删除
  157.     {
  158.         CMstTradeField trade;
  159.         memset(&trade, 0, sizeof(CMstTradeField));
  160.         strncpy_s(trade.InvestorID, "", _TRUNCATE);
  161.         strncpy_s(trade.InstrumentID, "SH.600036", _TRUNCATE);
  162.         trade.Direction = MST_D_Buy;    // MST_D_Buy买入、MST_D_Sell卖出
  163.         strncpy_s(trade.TradeID, "100000", _TRUNCATE);  // 成交编号
  164.         trade.Volume = 600;             // 数量
  165.         trade.Price = 30.0;             // 价格
  166.         strncpy_s(trade.TradeDate, "20250405", _TRUNCATE); // 成交时期
  167.         strncpy_s(trade.TradeTime, "140835", _TRUNCATE);   // 成交时间
  168.         SendNotifyMessage(TRADE_TYPE_RSPTRADE, FALSE, (WPARAM)&trade); // 只能一条一条通知,最后一条的bIsLast参数必须为TRUE
  169.     }

  170.     return 0;
  171. }

  172. // 报单录入请求
  173. int CMsOpenTraderApi::ReqOrderInsert(const char* lpszExchangeID, const char* lpszInstrument, double dPrice, int nVol, char cOrderPriceType, char cDirection, char cCombOffsetFlag, char cCombHedgeFlag, double dStopPrice /*= 0*/)
  174. {
  175.     // 现货不能BuyShort, SellShort
  176.     if (cDirection == MST_D_Buy && cCombOffsetFlag != MST_OF_Open)
  177.         return 0;
  178.     if (cDirection == MST_D_Sell && cCombOffsetFlag == MST_OF_Open)
  179.         return 0;

  180.     ++m_nOrderRef;  // 每次报单引用号必须加1,返回的报单引用号将作为后续撤单、成交回报等指令的单号


  181.     // 可自行修改报单录入请求,并返回通知到易得。

  182.     WriteBlackCon("开放交易接口收到报单录入请求,请自行修改!\r\n"); // 此行可删除

  183.     char szMg[1024] = {0};
  184.     sprintf_s(szMg, sizeof(szMg)-1, "收到下单指令:%s %s, 价格:%0.2f, 数量:%d\r\n", \
  185.         cDirection==MST_D_Buy ? "买入" : "卖出", lpszInstrument, dPrice, nVol);
  186.     WriteBlackCon(szMg);

  187.     {
  188.         // 先返回报道通知

  189.         CMstRspInfoField rspInfo;
  190.         memset(&rspInfo, 0, sizeof(CMstRspInfoField));
  191.         rspInfo.ErrorID = 0; // 0表示无错误,非0表示错误
  192.         strncpy_s(rspInfo.ErrorMsg, "", _TRUNCATE);   // 错误信息

  193.         CMstOrderField orderField;
  194.         memset(&orderField, 0, sizeof(CMstOrderField));
  195.         sprintf_s(orderField.OrderSysID, sizeof(orderField.OrderSysID), "%d", m_nOrderRef);   // 将OrderSysID和OrderRef都设为m_nOrderRef
  196.         sprintf_s(orderField.OrderRef, sizeof(orderField.OrderRef), "%d", m_nOrderRef);
  197.         strncpy_s(orderField.InsertDate, "20250405", _TRUNCATE); // 报单日期
  198.         strncpy_s(orderField.InsertTime, "140835", _TRUNCATE);   // 委托时间
  199.         strncpy_s(orderField.InstrumentID, lpszInstrument, _TRUNCATE);
  200.         orderField.Direction = cDirection;
  201.         orderField.LimitPrice = dPrice;
  202.         orderField.VolumeTotalOriginal = nVol;
  203.         orderField.OrderStatus = MST_OST_AllTraded; // 全部成交:MST_OST_AllTraded;   部分成交:MST_OST_PartTradedQueueing,
  204.         strncpy_s(orderField.StatusMsg, "", _TRUNCATE);

  205.         SendNotifyMessage(TRADE_TYPE_RTNORDER, TRUE, (WPARAM)&orderField, (LPARAM)&rspInfo);

  206.         WriteBlackCon("开放交易接口返回报道通知!\r\n"); // 此行可删除

  207.     }

  208.     {
  209.         // 再返回成交回报
  210.         CMstTradeField tradeField;
  211.         memset(&tradeField, 0, sizeof(CMstTradeField));

  212.         sprintf_s(tradeField.OrderSysID, sizeof(tradeField.OrderSysID), "%d", m_nOrderRef);   // 将OrderSysID和OrderRef都设为m_nOrderRef
  213.         sprintf_s(tradeField.OrderRef, sizeof(tradeField.OrderRef), "%d", m_nOrderRef);
  214.         strncpy_s(tradeField.InstrumentID, lpszInstrument, _TRUNCATE);
  215.         tradeField.Direction = cDirection;
  216.         tradeField.Price = dPrice;
  217.         tradeField.Volume = nVol;
  218.         strncpy_s(tradeField.TradeDate, "20250405", _TRUNCATE); // 成交时期
  219.         strncpy_s(tradeField.TradeTime, "1408356", _TRUNCATE);   // 成交时间

  220.         SendNotifyMessage(TRADE_TYPE_RTNTRADE, TRUE, (WPARAM)&tradeField);

  221.         WriteBlackCon("开放交易接口返回成交回报!\r\n"); // 此行可删除
  222.     }


  223.     return m_nOrderRef; // 返回报单引用号, 将作为后续撤单、成交回报等指令的单号
  224. }

  225. // 报单操作请求 (撤单)
  226. int CMsOpenTraderApi::ReqOrderAction(const char* lpszOrderSysID, const char* lpszExchangeID, const char* lpszInstrumentID)
  227. {
  228.     // 可自行修改报单操作请求,并返回通知到易得。

  229.     WriteBlackCon("开放交易接口收到报单操作请求,请自行修改!\r\n"); // 此行可删除

  230.     char szMg[256] = {0};
  231.     sprintf_s(szMg, sizeof(szMg)-1, "收到撤单指令:单号:%s, %s \r\n", lpszOrderSysID,  lpszInstrumentID);
  232.     WriteBlackCon(szMg);

  233.     CMstRspInfoField rspInfo;
  234.     memset(&rspInfo, 0, sizeof(CMstRspInfoField));
  235.     rspInfo.ErrorID = 0; // 0表示无错误,非0表示错误
  236.     strncpy_s(rspInfo.ErrorMsg, "", _TRUNCATE);   // 错误信息

  237.     CMstInputOrderActionField inputOrderActionField;
  238.     memset(&inputOrderActionField, 0, sizeof(CMstInputOrderActionField));
  239.     strncpy_s(inputOrderActionField.OrderSysID, lpszOrderSysID, _TRUNCATE);
  240.     strncpy_s(inputOrderActionField.InstrumentID, lpszInstrumentID, _TRUNCATE);

  241.     SendNotifyMessage(TRADE_TYPE_RSPORDERACTION, TRUE, (WPARAM)&inputOrderActionField, (LPARAM)&rspInfo);

  242.     return 0;
  243. }

  244. // 查询最大报单数量请求
  245. int CMsOpenTraderApi::ReqQueryMaxOrderVolume(const char* lpszInstrument, char cDirection, char cOffsetFlag, char cHedgeFlag)
  246. {
  247.     return 0;
  248. }


  249. //////////////////////////////////////////////////////////////////////////////////////////////////////////
  250. //////////////////////////////////////////////////////////////////////////////////////////////////////////
  251. // 以下接口可直接使用,无需改动

  252. CMsOpenTraderApi::CMsOpenTraderApi(void* pTradeAccount, CWnd* pTradeSpiNotifyWnd)
  253. {
  254.     // 接口开发者无需改动此函数
  255.     m_pTradeAccount = pTradeAccount;
  256.     m_pTradeSpiNotifyWnd = pTradeSpiNotifyWnd;
  257. }

  258. CMsOpenTraderApi::~CMsOpenTraderApi()
  259. {
  260.     // 接口开发者无需改动此函数
  261.     Release();
  262. }

  263. // 释放连接
  264. void CMsOpenTraderApi::Release()
  265. {
  266.     // 此接口一般无需改动,根据需要也可自行修改
  267. }

  268. // 通知易得交易消息
  269. void CMsOpenTraderApi::SendNotifyMessage(RCV_TRADE_TYPE rcvTradeType, bool bIslast /*= TRUE*/, WPARAM wParam /*= NULL*/, LPARAM lParam /*= NULL*/)
  270. {
  271.     // 接口开发者无需改动此函数
  272.     WND_TRADE_MESSAGE msg;
  273.     msg.m_rcvTradeType = rcvTradeType;
  274.     msg.m_pTradeAccount = m_pTradeAccount;
  275.     msg.m_bIsLast = bIslast;
  276.     msg.m_wParam = wParam;
  277.     msg.m_lParam = lParam;
  278.     m_pTradeSpiNotifyWnd->SendMessage(WM_WND_TRADE_MESSAGE, (WPARAM)&msg, NULL);
  279. }

  280. //////////////////////////////////////////////////////////////////////////////////////////////////////////
  281. //////////////////////////////////////////////////////////////////////////////////////////////////////////
复制代码


回复

使用道具 举报

2

主题

5

帖子

41

积分

新手上路

Rank: 1

积分
41
发表于 6 天前 | 显示全部楼层
期待易得做大做强
回复

使用道具 举报

8

主题

39

帖子

2034

积分

金牌会员

Rank: 6Rank: 6

积分
2034
QQ
发表于 6 天前 | 显示全部楼层
二楼没抢到!抢三楼!
回复

使用道具 举报

0

主题

1

帖子

4

积分

新手上路

Rank: 1

积分
4
发表于 6 天前 | 显示全部楼层
可以不错 希望易得越来越好
回复

使用道具 举报

9

主题

28

帖子

3495

积分

论坛元老

Rank: 8Rank: 8

积分
3495
QQ
发表于 5 天前 | 显示全部楼层
这是重大进步啊。
回复

使用道具 举报

0

主题

1

帖子

4

积分

新手上路

Rank: 1

积分
4
发表于 5 天前 | 显示全部楼层
学习学习
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|小黑屋|易得程序化 ( 粤ICP备2022064048号 )

GMT+8, 2025-5-22 02:27 , Processed in 0.067252 second(s), 24 queries .

快速回复 返回顶部 返回列表