嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300
本次赞助数额为: 2 元微信扫码支付:2 元
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
自己学习Qt使用写得一个期货数据获取工具。有点简单。
获取交易所的期货数据。里面的合约日期根据实际情况修改。
实体在VS2019可以运行
#include "TraderCpt.h"
//#include "QtGuiApplicationCtp.h"
//#include "MdSpiQtClass.h"
//#include "ThostFtdcMdApi.h"
#include "QMessageBox"
//#include "tinyxml.h"
//#include "tinystr.h"
#include <string>
#include "QFile"
#include "QTextStream"
#include "QtClass_AutoTrader.h"
QtClass_AutoTrader qAutoTrader;
double ksbl = 0; //亏损比例
TraderCpt::TraderCpt(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
md = new MdSpi();
td = new TdSpi();
TdSpi::HYStruct hy;
bool a =connect(md, SIGNAL(sendData(QString)), this, SLOT(ReceiveHQ(QString))); //连接行情信号
connect(td, SIGNAL(sendCQ(QString)), this, SLOT(ReceiveCQ(QString))); //连接持仓信号
connect(td, SIGNAL(sendZJ(QString)), this, SLOT(ReceiveZJ(QString))); //连接资金信号
//行情代码
ui.tableWidget_HQ->setColumnCount(13);
QStringList headerHQ;
headerHQ.append(QString::fromLocal8Bit("合约代码"));
headerHQ.append(QString::fromLocal8Bit("网络时间"));
headerHQ.append(QString::fromLocal8Bit("开仓价格"));
headerHQ.append(QString::fromLocal8Bit("持仓类型"));
headerHQ.append(QString::fromLocal8Bit("持仓数量"));
headerHQ.append(QString::fromLocal8Bit("当前盈亏"));
headerHQ.append(QString::fromLocal8Bit("平仓时间"));
headerHQ.append(QString::fromLocal8Bit("保证金比例%"));
headerHQ.append(QString::fromLocal8Bit("资金亏损比例%"));
headerHQ.append(QString::fromLocal8Bit("开盘价"));
headerHQ.append(QString::fromLocal8Bit("买一价"));
headerHQ.append(QString::fromLocal8Bit("卖一价"));
headerHQ.append(QString::fromLocal8Bit("最新价"));
ui.tableWidget_HQ->setHorizontalHeaderLabels(headerHQ);
ui.tableWidget_HQ->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
ui.tableWidget_HQ->setSelectionBehavior(QAbstractItemView::SelectRows);
readTxt("pz.txt");
ui.radioButton_stop->setChecked(true);
}
void TraderCpt::OnAddHeyue()
{
addHeyue();
writeTxt("pz.txt");
}
void TraderCpt::mdLogin()
{
char *ch1;
char *ch2;
char *ch3;
char *ch4;
char *ch5;
QByteArray ba1 = ui.lineEdit_MD->text().toLatin1();
QByteArray ba2 = ui.lineEdit_BrokerID->text().toLatin1();
QByteArray ba3 = ui.lineEdit_TD->text().toLatin1();
QByteArray ba4 = ui.lineEdit_User->text().toLatin1();
QByteArray ba5 = ui.lineEdit_PassWord->text().toLatin1();
ch1 = ba1.data();
ch2 = ba2.data();
ch3 = ba3.data();
ch4 = ba4.data();
ch5 = ba5.data();
strcpy(md->hq.FRONT_ADDR, ch1);
strcpy(md->hq.BROKER_ID, ch2);
strcpy(md->hq.INVESTOR_ID, ch3);
md->Init();
//交易登陆
QString account = ui.lineEdit_User->text();
QString password = ui.lineEdit_PassWord->text();
strcpy(td->jy.FRONT_ADDR, ch3);
strcpy(td->jy.BROKER_ID, ch2);
strcpy(td->jy.INVESTOR_ID, ch4);
strcpy(td->jy.PASSWORD, ch5);
td->Init();
}
void TraderCpt::ReceiveHQ(QString TICK)
{
QStringList strlist = TICK.split(",");
//qAutoTrader
for (int i = 0; i < ui.tableWidget_HQ->rowCount(); i )
{
if (ui.tableWidget_HQ->item(i, 0)->text() == strlist.at(0))
{
qAutoTrader.hyDm = strlist.at(0);
qAutoTrader.CData = strlist.at(12);
qAutoTrader.CTime = strlist.at(1);
qAutoTrader.atLastPrice = strlist.at(2).toInt();
qAutoTrader.atVol = strlist.at(8).toInt();
qAutoTrader.readTxt(strlist.at(0)); //读取文件
ui.tableWidget_HQ->setItem(i, 1, new QTableWidgetItem(strlist.at(1))); //合约代码
ui.tableWidget_HQ->setItem(i, 9, new QTableWidgetItem(strlist.at(11))); //开盘价
ui.tableWidget_HQ->setItem(i, 10, new QTableWidgetItem(strlist.at(3))); //买一价
ui.tableWidget_HQ->setItem(i, 11, new QTableWidgetItem(strlist.at(5))); //卖一价
ui.tableWidget_HQ->setItem(i, 12, new QTableWidgetItem(strlist.at(2))); //最新价
if (ui.tableWidget_HQ->item(i,2) == NULL)
{
return;
}
if (ui.tableWidget_HQ->item(i,2)->text() == " ")
{
ui.tableWidget_HQ->setItem(i, 5, new QTableWidgetItem(""));
return;
}
return;
}
kc(i);
pc(i); //开仓与平仓
}
}
void TraderCpt::ReceiveCQ(QString CCData)
{
QString lx;
QStringList strlist = CCData.split(",");
if (strlist.at(1) == "2")
{
lx = QString::fromLocal8Bit("买");
}
else if (strlist.at(1) == "3")
{
lx = QString::fromLocal8Bit("卖");
}
for (int i = 0; i < ui.tableWidget_HQ->rowCount(); i )
{
if (ui.tableWidget_HQ->item(i,0)->text()==strlist.at(0))
{
ui.tableWidget_HQ->setItem(i, 2, new QTableWidgetItem(strlist.at(3)));
ui.tableWidget_HQ->setItem(i, 3, new QTableWidgetItem(lx));
ui.tableWidget_HQ->setItem(i, 4, new QTableWidgetItem(strlist.at(2)));
return;
}
}
int row = ui.tableWidget_HQ->rowCount();
ui.tableWidget_HQ->insertRow(row);
}
void TraderCpt::ReceiveZJ(QString ZJData)
{
QStringList strlist = ZJData.split(",");
QString yinKui = strlist.at(4);
QString yinKuiBi = strlist.at(5);
ui.label_yinKui->setText(yinKui);
ui.label_yinKui_BiLi->setText(yinKuiBi);
ksbl = yinKuiBi.toDouble();
}
void TraderCpt::addHeyue()
{
int row = ui.tableWidget_HQ->rowCount();
ui.tableWidget_HQ->insertRow(row);
ui.tableWidget_HQ->setItem(row, 0, new QTableWidgetItem(ui.lineEdit_JianKongDaiMa->text()));
ui.tableWidget_HQ->setItem(row, 6, new QTableWidgetItem(ui.lineEdit_PingCangTime->text()));
ui.tableWidget_HQ->setItem(row, 7, new QTableWidgetItem(ui.lineEdit_BaoZhengJinBiLi->text()));
ui.tableWidget_HQ->setItem(row, 8, new QTableWidgetItem(ui.lineEdit_KuiShunBiLi->text()));
}
void TraderCpt::writeTxt(QString path)
{
QFile myData(path);
if (myData.open(QFile::WriteOnly | QIODevice::Truncate)) //Truncata :覆盖 Append 追加
{
QTextStream out(&myData);
for (int i = 0; i <ui.tableWidget_HQ->rowCount(); i )
{
QString dm = ui.tableWidget_HQ->item(i, 0)->text();
QString pcTime = ui.tableWidget_HQ->item(i, 6)->text();
QString bzj = ui.tableWidget_HQ->item(i, 7)->text();
QString loss = ui.tableWidget_HQ->item(i, 8)->text();
out << dm "," pcTime "," bzj "," loss "\r\n";
}
myData.close();
}
}
void TraderCpt::readTxt(QString path)
{
ui.lineEdit_MD->setText("tcp://180.168.146.187:10010"); //正常交易日
//ui.lineEdit_MD->setText("tcp://180.168.146.187:10031"); //节假日模拟行情
ui.lineEdit_TD->setText("tcp://180.168.146.187:10000");
//ui.lineEdit_TD->setText("tcp://180.168.146.187:10030");
ui.lineEdit_BrokerID->setText("");
ui.lineEdit_User->setText("");
ui.lineEdit_PassWord->setText("");
QFile file(path);
QStringList strdm;
if (file.open(QIODevice::ReadOnly | QIODevice::Text))
{
while (!file.atEnd())
{
QByteArray line = file.readLine();
QString str(line);
if (str.trimmed()== "")
{
continue;
}
QStringList strlist = str.split(",");
int row = ui.tableWidget_HQ->rowCount();
ui.tableWidget_HQ->insertRow(row);
ui.tableWidget_HQ->setItem(row, 0, new QTableWidgetItem(strlist.at(0)));
ui.tableWidget_HQ->setItem(row, 6, new QTableWidgetItem(strlist.at(1)));
ui.tableWidget_HQ->setItem(row, 7, new QTableWidgetItem(strlist.at(2)));
ui.tableWidget_HQ->setItem(row, 8, new QTableWidgetItem(strlist.at(3)));
strdm.append(strlist.at(0));
md->Dm = strdm.join(",");
}
}
}
void TraderCpt::kc(int i)
{
//自动下单操作
int vol = 0;
QString dm = ui.tableWidget_HQ->item(i, 0)->text();
QString settime = ui.tableWidget_HQ->item(i, 6)->text();
QString updatetime = ui.tableWidget_HQ->item(i, 1)->text();
QString ksbfb = ui.tableWidget_HQ->item(i, 8)->text();
if (ksbl >ksbfb.toDouble())
{
return;
}
if (ui.radioButton_run->isChecked() == false)
{
return;
}
if (pcTime(updatetime,settime))
{
return;
}
if (ui.tableWidget_HQ->item(i,9)== NULL || ui.tableWidget_HQ->item(i,11) == NULL )
{
return;
}
if (ui.tableWidget_HQ->item(i,4) != NULL)
{
vol = ui.tableWidget_HQ->item(i, 4)->text().toInt();
}
if (vol > 0)
{
return;
}
if (ui.label_WKC->text() == "已开仓")
{
return;
}
double openprice = ui.tableWidget_HQ->item(i, 9)->text().toDouble();
double lastprice = ui.tableWidget_HQ->item(i, 12)->text().toDouble();
double buyprice = ui.tableWidget_HQ->item(i, 10)->text().toDouble();
double sellprice = ui.tableWidget_HQ->item(i, 11)->text().toDouble();
if (lastprice > openprice && ui.tableWidget_HQ->item(i, 2)->text() == " ")
{
td->ReqOrderInsert(dm, "开多", 1, buyprice);
ui.label_WKC->setText("已开仓");
}
else if (lastprice < openprice && ui.tableWidget_HQ->item(i, 2)->text() == " ")
{
td->ReqOrderInsert(dm, "开空", 1, sellprice);
}
}
void TraderCpt::pc(int i)
{
int vol = 0;
QString ksbfb = ui.tableWidget_HQ->item(i, 8)->text();
if (ui.radioButton_run->isChecked() == false)
{
return;
}
QString dm = ui.tableWidget_HQ->item(i, 0)->text();
if (ui.tableWidget_HQ->item(i,4) == NULL)
{
return;
}
if (ui.tableWidget_HQ->item(i, 9) == NULL || ui.tableWidget_HQ->item(i, 11) == NULL)
{
return;
}
if (ui.tableWidget_HQ->item(i, 4) != NULL)
{
vol = ui.tableWidget_HQ->item(i, 4)->text().toInt();
}
if (vol == 0)
{
return;
}
QString netTime = ui.tableWidget_HQ->item(i, 1)->text().trimmed();
QString ccLx = ui.tableWidget_HQ->item(i, 3)->text().trimmed();
QString setTime = ui.tableWidget_HQ->item(i, 6)->text().trimmed();
double openprice = ui.tableWidget_HQ->item(i, 9)->text().toDouble();
double lastprice = ui.tableWidget_HQ->item(i, 12)->text().toDouble();
double buyprice = ui.tableWidget_HQ->item(i, 10)->text().toDouble();
double sellprice = ui.tableWidget_HQ->item(i, 11)->text().toDouble();
//价格平仓
if (lastprice > openprice && ccLx == "买" && vol >= 1)
{
td->ReqOrderInsert(dm, "平多", 1, sellprice);
ui.label_WKC->setText("已开仓");
}
else if (lastprice < openprice && ccLx == "卖" && vol >= 1)
{
td->ReqOrderInsert(dm, "平空", 1, buyprice);
}
//时间平仓
if (pcTime(netTime,setTime) == true|| ksbl > ksbfb.toDouble())
{
if (ccLx == QString::fromLocal8Bit("买") && vol >= 1)
{
td->ReqOrderInsert(dm, "平多", 1, sellprice);
vol = 0;
}
else if (ccLx == QString::fromLocal8Bit("卖") && vol >= 1)
{
td->ReqOrderInsert(dm, "平空", 1, buyprice);
vol = 0;
}
}
//超过亏损平仓
}
bool TraderCpt::pcTime(QString netTime, QString setTime)
{
QDateTime netT = QDateTime::fromString(netTime, "hh:mm:ss");
QDateTime setT = QDateTime::fromString(setTime, "hh:mm:ss");
if (netT >setT)
{
return true;
}
else
{
return false;
}
}