Groups
-
wdg
我是林,我是一名来自量化基金的CTP开发者,我做CTP已经有5个年头了。
我在这里会分享对CTP开发的一些见解,希望对大家有用。
通常我们从上期网址下载CTP接口的API后,从网上找到1个CTP DEMO就开始搭建第一个CTP程序。
其实CTP的例子很多,但大多只涉及了交易部分的简单例子,对有基础的初学者来说,可以很快理解了如何调用CTP接口,并从CTP回调函数获取数据的方法。
5年前我也是这样开始了CTP开发之路,CTP对我来说已经是生活的一部分。
CTP开发过程中最麻烦的事就是回测问题, 回测涉及到数据的采集。数据清洗,数据回测框架,实盘程序接入回测框架等等步骤。
很多CTP开发者没有自己开发回测框架,就利用上期的SIMNOW (http://www.simnow.com.cn)进行测试,但其实Simnow应该只作为功能测试而不是策略回测。
在大名鼎鼎的CTP体系下,最著名的是Virtualapi (http://www.virtualapi.cn )、VNPY、优矿、聚宽等。
其中Virtualapi久负盛名,可以说是CTP最优秀的回测方案,而且申请了国家发明专利,Virtualapi可用于本地TICK级别回测。
VNPY (http://www.vnpy.cn)以大而全著称,但是回测模块就显的差强人意了。好在Virtualapi可以完美支持VNPY,Virutalapi不仅支持VNPY,还支持所有CTP自编CTP程序和各种CTP框架进行回测,因为Virtualapi本身就是完全仿真了CTP嘛。
优矿和聚矿据说更适合在线回测,A股的多因子回测, 做期货的一般都用Virtualapi for CTP在本机进行TICK级回测。
策略回测我们应该使用Virtualapi (http://www.virtualapi.cn )这样的TICK级本地仿真API,有了它我们做ctp的工作就简单多了。
VirtualApi诞生的技术背景
现在的量化回测软件和方法有三类,一类是通过文华、TB、MC等商业软件,在商业软件中通过编写交易指标和交易公式,或通过加载用户自己开发的第三方策略库进行交易策略的开发和回测;第二类是直接使用交易所、券商、API软件服务商提供的API或券商等机构提供的行情和交易API直接开发交易策略,或通过一些回测框架调用这些原生API进行回测;第三类是利用聚宽、优矿的网站在线平台进行回测。
若采用第一类商业软件开发量化交易回测系统,虽然对从事量化交易的人来说,开发策略需要的工作量较少,对开发者编程能力要求不高。但缺点也是显而易见的,除了商业软件本身需要收费提高了交易成本以外,采用商业软件开发交易策略不够灵活,使得很多交易策略无法实现。
若采用第二类直接使用API开发策略或采用针对API的回测框架,例如python的各种回测框架、matlaba的各种回测框架、R语言的各种回测框架,PyAlgoTrade、Zipline等、虽然开发策略较为灵活,但缺点是开发交易策略的实盘代码并不能直接进行回测,必须要采用引入回测框架进行回测,待回测完毕,再将回测完成的参数接入实盘策略代码中或删除回测框架部分的代码接入实盘交易的API,使得量化交易回测代码和实盘的代码有较大的改动,增加了策略开发者的工作,也增加了量化交易爱好者时间成本,甚至对很多编程能力有限的量化爱好者来说提搞了研究难度的门槛。
若采用第三类在线回测平台进行回测,由于需要将编写的策略在网站指定的服务器上运行,由于是多用户共享一台服务器,所以回测性能无法得到保证、网站更倾向于采用精度不高的数据进行回测。还由于对策略开发者来说不是使用原生API进行开发策略,所以策略开发的自由度也不够,很多想法也无法实现。更重要的是,选择网站在线平台的方式来开发量化交易策略,就等于默认了网站管理员可随时查看自己辛辛苦苦开发的策略代码,保密性让人担忧,从事量化交易的专业机构几乎不会采用在线网站的回测方式。
近年来,量化交易在金融领域应用的越来越广发,回测系统的设计是量化交易中不可缺失的一部分,但同时也暴露出一些问题,例如商业软件成本高、自己搭建会测框架时间成本高,难度大、采用第三方回测框架难度大、回测到实盘交易的代码改动较大、量化策略保密性不高等等。
为了克服现有技术存在的上述不足,VirtualApi仿真API的回测技术应运而生,它是模拟原生API来实现的。例如通过模拟原生交易API和行情API,例如通过模拟原生API的库方法的定义、头文件的定义等,使得回测和实盘交易代码,简单的将实盘代码替换为仿真API,对底层代码可不作改动或改动较少即可实现回测和参数优化。
支持的编程语言
VirtualApi Api支持多种编程语言,包括C++、Python、Java、C#、Golang、易语言等 。
支持的操作系统
VirtualApi Api支持Windows操作系统,版本要求Windows7、Windows2008及以上。
支持的量化交易框架
VirtualApi 支持各种基于CTP接口的自编程序和框架,例如vn.py、Quicklib、海风等。
CTP实盘程序流程图(C++)
典型CTP实盘程序流程图VirtualApi回测程序流程图(C++)
VirtualApi For CTP回测程序流程图代码
代码
CTP库文件CTP Api是C++库,理论上可以用于包括C++、Python、Java、C#、等在内的多种编程语言的调用。
VirtualApi For CTP一样是采用C++开发,目前只支持Windows操作系统,运行采用VirtualApi Api的计算机和TradeAgent.exe的计算机采用要求Windows7、Windows2008及以上系统,对于Windwo7和Windows Server2008这些较为陈旧的Windows系统安装微软运行时库redist2015补丁。
以最常用的CTP无中继代理模式为例(于2019.6.14实施的穿透式和老的非穿透式),CTP API Windows版本含以下文件:
其中ThostFtdcMdApi.h、ThostFtdcTraderApi.h、ThostFtdcUserApiDataType.h、ThostFtdcUserApiStruct.h 是头文件,thostmduserapi.dll、thosttraderapi.dll、thostmduserapi.lib、thosttraderapi.dll。
VirtualApi库文件
VirtualApi For CTP库文件包含以下文件:
可以看到VirtualApi 库在原CTP库基础上增加了list.csv,Price.exe,Graph.exe这3个文件,而对于thostmduserapi.dll、thosttraderapi.dll、thostmduserapi.lib、thosttraderapi.dll这4个文件是VirtualApi提供模拟CTP的实现,而ThostFtdcMdApi.h、ThostFtdcTraderApi.h、ThostFtdcUserApiDataType.h、ThostFtdcUserApiStruct.h 这4个头文件则保持和CTP对应版本一模一样。
list.csv作用:该程序放到回测程序的目录下,用于指定csv格式的数据文件的存放路径,并非自己存放Tick数据,在回测时VirtualApi会从上至下依次读取list.csv种这些文件的Tick数据,并触发CTP方法里的深度行情通知回调函数 virtual void OnRtnDepthMarketData(CThostFtdcDepthMarketDataField *pDepthMarketData),使得和CTP的OnRtnDepthMarketData回调方法一致。 值得注意的是,list.csv指定的数据文件库的字段顺序目前不能更改,将来可能提供字段顺序的自定义设置功能。
localtime (本机写入TICK的时间),
InstrumentID (合约名),
TradingDay (交易日),
ActionDay (业务日期),
UpdateTime (时间),
UpdateMillisec(时间毫秒),
LastPrice (最新价),
Volume(成交量) ,
HighestPrice (最高价),
LowestPrice(最低价) ,
OpenPrice(开盘价) ,
ClosePrice(收盘价),
AveragePrice(均价),
AskPrice1(申卖价一),
AskVolume1(申卖量一),
BidPrice1(申买价一),
BidVolume1(申买量一),
UpperLimitPrice(涨停板价),
LowerLimitPrice(跌停板价),
OpenInterest(持仓量),
Turnover(成交金额),
PreClosePrice (昨收盘),
PreOpenInterest (昨持仓),
PreSettlementPrice (上次结算价),Graph.exe作用:该程序放到回测程序的目录下。在回测时,回测程序通过API会自动打开Graph.exe,在回测时自动绘制资金曲线分时图;回测完成后,也可以将回测数据文件拖入Graph.exe窗口打开资金曲线分时图;
Price.exe作用:该程序放到回测程序的目录下。在回测的过程中或回测技术后,可以将回测数据文件拖入price.exe窗口,绘制回测时间段内的行情多日分时图,可以和Graph.exe显示的资金曲线进行对照。
C++ DemoC++ Demo采用Visual Studio2015、Visual Studio2017、Visual Studio2019 编译,运行test.sln打开Demo项目。
微软最新版本的Visual Studio下载: https://visualstudio.microsoft.com/zh-hans/downloads/
AutoTrader.cpp
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <string>
#include <windows.h>
#include <time.h>
#include <iomanip>
#include <vector>
#include <algorithm>
#include <stdlib.h>
using namespace std;#include “.\ThostTraderApi\ThostFtdcTraderApi.h”
#include “.\ThostTraderApi\ThostFtdcMdApi.h”
#include “TraderSpi.h”
#include “MdSpi.h”
#include “Common.h”
#include “DataSniffer.h”
#include “MyTrader.h”#pragma warning(disable : 4996)
// UserApi对象
CThostFtdcTraderApi *pUserApi;
// MdApi对象
CThostFtdcMdApi *pMdApi;// 配置参数
char FRONT_ADDR_1A[] = “tcp://180.168.146.187:10000”; // 前置地址1交易:实盘
char FRONT_ADDR_1B[] = “tcp://180.168.146.187:10010”; // 前置地址2行情:实盘char FRONT_ADDR_2A[] = “tcp://180.168.146.187:10000”; // 前置地址1交易:盘后
char FRONT_ADDR_2B[] = “tcp://180.168.146.187:10010”; // 前置地址2行情:盘后char FRONT_ADDR_3A[] = “tcp://180.168.146.187:10000”; // 前置地址3交易:仿真 17:00开始
char FRONT_ADDR_3B[] = “tcp://180.168.146.187:10010”; // 前置地址3行情:仿真 17:00开始TThostFtdcBrokerIDType BROKER_ID = “9999”; // 实盘:经纪公司代码 国泰君安=7090
TThostFtdcInvestorIDType INVESTOR_ID = “038997”; // 实盘:投资者代码
TThostFtdcPasswordType PASSWORD = “000000wdg”; // 实盘:用户密码
//TThostFtdcBrokerIDType BROKER_ID = “2030”; // 经纪公司代码:仿真
//TThostFtdcInvestorIDType INVESTOR_ID = “00092”; // 投资者代码:仿真
//TThostFtdcPasswordType PASSWORD = “888888”; // 用户密码:仿真TThostFtdcInstrumentIDType INSTRUMENT_ID = “rb1910”; // 交易合约代码
TThostFtdcDirectionType DIRECTION; // 交易买卖方向
TThostFtdcOffsetFlagType MARKETState; // 开平仓
TThostFtdcPriceType LIMIT_PRICE; // 交易价格//char *ppInstrumentID[] = {“IF1910”, “rb1910”,“ag1910”, “ru1910”, “cu1910”, “j1910”, “SR1910”, “m1910”, “y1910”, “p1910”}; // 行情订阅列表
//int iInstrumentID = 10; // 行情订阅数量char *ppInstrumentID[] = { “rb1910”}; // 行情订阅列表
int iInstrumentID = 1; // 行情订阅数量
bool ReceiveTick = false;// 请求编号
int iRequestID = 0;
// 交易时间
bool JustRun = false; //正在启动标志TThostFtdcDateExprType TradingDay;
// User行情数据
extern char *InstrumentID_name; //
extern string Q_BarTime_s; //时间字符串
extern int Q_BarTime_1; //时间采用秒计
extern double Q_BarTime_2; //时间格式0.145100
extern double Q_UpperLimit;
extern double Q_LowerLimit;extern double NewPrice;
extern int FirstVolume; //前一次成交量数据extern double Mn_open[3]; //
extern double Mn_high[3]; //
extern double Mn_low[3]; //
extern double Mn_close[3]; //extern double BuyPrice; //开仓价
extern double SellPrice; //开仓价
extern int BNum; //开仓次数
extern int SNum; //开仓次数extern bool BuySignal;
extern bool SellSignal;extern double BSVolume; //开仓量
extern int TickABS;
extern double TickAPrice[4];
extern int TickBNum;
extern double TickBPrice[4];extern char LogFilePaths[80];
// 会话参数
extern TThostFtdcFrontIDType FRONT_ID; //前置编号
extern TThostFtdcSessionIDType SESSION_ID; //会话编号
extern TThostFtdcOrderRefType ORDER_REF; //报单引用void main(void)
{
void Erasefiles();
void Sniffer();
void Trading();
bool ReadConfiguration(char *filepaths);
void WriteConfiguration(char *filepaths);Erasefiles(); Sleep(2000); cerr << "--->>> " << "Welcom MyAutoTrader System!" << endl; cerr << "--->>> " << "Version 1.0.0!" << endl; // 初始化UserApi pUserApi = CThostFtdcTraderApi::CreateFtdcTraderApi("./thosttraderapi.dll"); // 创建UserApi//"./thosttraderapi.dll" CTraderSpi* pUserSpi = new CTraderSpi(); pUserApi->RegisterSpi((CThostFtdcTraderSpi*)pUserSpi); // 注册事件类 pUserApi->SubscribePublicTopic(THOST_TERT_RESTART); // 注册公有流 pUserApi->SubscribePrivateTopic(THOST_TERT_RESTART); // 注册私有流 pUserApi->RegisterFront(FRONT_ADDR_1A); // connect pUserApi->Init(); cout << pUserApi->GetApiVersion() << endl; cout << "--->>> " << "Initialing TradeApi" << endl; // 初始化MdApi pMdApi = CThostFtdcMdApi::CreateFtdcMdApi("./thostmduserapi.dll"); // 创建MdApi//"./thostmduserapi.dll" CThostFtdcMdSpi* pMdSpi = new CMdSpi(); pMdApi->RegisterSpi(pMdSpi); // 注册事件类 pMdApi->RegisterFront(FRONT_ADDR_1B); // connect 优先行情地址 pMdApi->RegisterFront(FRONT_ADDR_2B); // connect 备用行情地址,1B断开,自动连接2B地址 cout << pMdApi->GetApiVersion() << endl; pMdApi->Init(); cout << "--->>> " << "Initialing MdApi" << endl; //pMdApi->Join(); //pMdApi->Release(); Sleep(6000); ReadConfiguration("./AutoTrader.dat"); //自定义数据,如持仓数据等均可 cout << "--->>> " << "初始化完成!" << endl; while(1) { //指标计算,下面只是个简单例子 //可自建函数,进行复杂处理 见DataSniffer.h Sniffer(); //下单控制 //可自建函数,单独复杂处理 见MyTrader.h Trading(); Sleep(50); }
}
stdafx.h
#pragma once
#ifndef _WIN32_WINNT // 允许使用特定于 Windows XP 或更高版本的功能。
#define _WIN32_WINNT 0x0501 // 将此值更改为相应的值,以适用于 Windows 的其他版本。
#endif
#include <stdio.h>
#include <tchar.h>
#include <string.h>
#include <windows.h>
#include <iostream>
using namespace std;TraderSpi.h
#pragma once
#include “stdafx.h”
#include “…\…\Library(C++)\ThostFtdcTraderApi.h”class CTraderSpi : public CThostFtdcTraderSpi
{
public:
///当客户端与交易后台建立起通信连接时(还未登录前),该方法被调用。
virtual void OnFrontConnected();///当客户端与交易后台通信连接断开时,该方法被调用。当发生这个情况后,API会自动重新连接,客户端可不做处理。 ///@param nReason 错误原因 /// 0x1001 网络读失败 /// 0x1002 网络写失败 /// 0x2001 接收心跳超时 /// 0x2002 发送心跳失败 /// 0x2003 收到错误报文 virtual void OnFrontDisconnected(int nReason); ///登录请求响应 // virtual void OnRspUserLogin(CThostFtdcRspUserLoginField *pRspUserLogin, CThostFtdcVirtualApiRspInfoField *pRspInfo, int nRequestID, bool bIsLast) ; virtual void OnRspUserLogin(char *username, char *password); ///登出请求响应 virtual void OnRspUserLogout(CThostFtdcVirtualApiLogoutField *pUserLogout, CThostFtdcVirtualApiRspInfoField *pRspInfo, int nRequestID, bool bIsLast); ///错误应答 virtual void OnRspError(CThostFtdcVirtualApiRspInfoField *pRspInfo, int nRequestID, bool bIsLast); ///报单录入请求响应 virtual void OnRspOrderInsert(COrderField *pInputOrder, CThostFtdcVirtualApiRspInfoField *pRspInfo, int nRequestID, bool bIsLast); ///请求查询投资者持仓响应 virtual void OnRspQryInvestorPosition(CThostFtdcInvestorPositionField *pInvestorPosition, CThostFtdcVirtualApiRspInfoField *pRspInfo, int nRequestID, bool bIsLast); virtual void OnRtnOrder(CThostFtdcTradeOrderField *pOrder);
public:
///请求查询资金账户
void ReqQryTradingAccount();///请求查询投资者持仓 void ReqQryInvestorPosition(); ///报单录入请求 void ReqOrderInsert(int Sid, char *Instrument, int Volume, double Price, double LastPrice, int Direction, char *Remark); ///报单操作请求 void ReqOrderAction(CThostFtdcTradeOrderField *pOrder); // 是否收到成功的响应 bool IsErrorRspInfo(CThostFtdcVirtualApiRspInfoField *pRspInfo); // 是否我的报单回报 bool IsMyOrder(CThostFtdcTradeOrderField *pOrder); // 是否正在交易的报单 bool IsTradingOrder(CThostFtdcTradeOrderField *pOrder);
};
TraderSpi.h
#include
#include
#include
#include
using namespace std;
#include “stdafx.h”
#include “…\…\Library(C++)\ThostFtdcTraderApi.h”
#include “TraderSpi.h”#pragma warning(disable : 4996)
// USER_API参数
extern CThostFtdcTraderApi* pTdApi;// 配置参数
extern char FRONT_ADDR[]; // 前置地址
extern char BROKER_ID[]; // 经纪公司代码
extern char INVESTOR_ID[]; // 投资者代码
extern char PASSWORD[]; // 用户密码
extern char* ppInstrumentID[];
extern int iInstrumentID;
extern char INSTRUMENT_ID[]; // 合约代码
extern TThostFtdcDirectionType DIRECTION; // 买卖方向
extern TThostFtdcOffsetFlagType MARKETState;//开平仓
extern TThostFtdcPriceType LIMIT_PRICE; // 价格
#define TYPE_NUM 20
extern double Q_UpperLimit;
extern double Q_LowerLimit;extern bool JustRun; //正在启动标志
// 会话参数
TThostFtdcFrontIDType FRONT_ID; //前置编号
TThostFtdcSessionIDType SESSION_ID; //会话编号
TThostFtdcOrderRefType ORDER_REF; //报单引用extern int needstate;
void CTraderSpi::OnFrontConnected()
{
cerr << “—>>> " << FUNCTION << endl;
char username[51] = { 0 };
char password[51] = { 0 };
pTdApi->GetLoginInfoUsername(username);
pTdApi->GetLoginInfoPassword(password);
pTdApi->ReqUserLogin(username, password);
printf(”[%s] are logging into the TradeAgent server…\n", username);
///用户登录请求
//ReqUserLogin();
Sleep(500);
}void CTraderSpi::OnRspUserLogin(char *username, char *password)
{
cerr << "—>>> " << FUNCTION << endl;/* if (pRspUserLogin == NULL) { cout << "--->>>指针错误OnRspUserLogin" << endl; //指针检查 //WirteTradeRecordToFileMainThread(0, "OnRspUserLogin指针错误"); Sleep(5000); ReqUserLogin();// 自己添加 return; } if (IsErrorRspInfo(pRspInfo)) { cerr << "--->>> 交易登录错误: " << pRspInfo->ErrorID << pRspInfo->ErrorMsg << endl; //WirteTradeRecordToFileMainThread(0, "交易登录错误"); Sleep(5000); ReqUserLogin();// 自己添加 } if (bIsLast && !IsErrorRspInfo(pRspInfo)) { // 保存会话参数 FRONT_ID = pRspUserLogin->FrontID; SESSION_ID = pRspUserLogin->SessionID; int iNextOrderRef = atoi(pRspUserLogin->MaxOrderRef); iNextOrderRef++; sprintf(ORDER_REF, "%d", iNextOrderRef); //cerr << "--->>> 报单引用 = " << ORDER_REF << endl; ///获取当前交易日 char TradingDay[9] = { "0" }; strcpy(TradingDay, pTdApi->GetTradingDay()); cerr << "--->>> 获取当前交易日 = " << pTdApi->GetTradingDay() << endl; } */
}
void CTraderSpi::OnRspUserLogout(CThostFtdcVirtualApiLogoutField *pUserLogout, CThostFtdcVirtualApiRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
{
}extern double YestayAllAmount;
extern double TodayAllAmount;
//extern double UserAmount;int JsReqQryTradingAccountFailer = 0;
void CTraderSpi::ReqQryTradingAccount()
{
/*
CThostFtdcQryTradingAccountField req;
memset(&req, 0, sizeof(req));
strcpy(req.BrokerID, BROKER_ID);
strcpy(req.InvestorID, INVESTOR_ID);
int iResult = pTdApi->ReqQryTradingAccount(&req, ++iRequestID);
//cerr << "—>>> 请求查询资金账户: " << ((iResult == 0) ? “成功” : “失败”) << endl;if (iResult == 0) { JsReqQryTradingAccountFailer= 0; } else { JsReqQryTradingAccountFailer++; if (JsReqQryTradingAccountFailer > 20) { printf("请求查询资金账户资金X失败"); } } */
}
double UserAmount = 0;
void CTraderSpi::ReqQryInvestorPosition()
{
/*
CThostFtdcQryInvestorPositionField req;
memset(&req, 0, sizeof(req));
strcpy(req.BrokerID, BROKER_ID);
strcpy(req.InvestorID, INVESTOR_ID);
strcpy(req.InstrumentID, InstrumentID_n[0]);
int iResult = pTdApi->ReqQryInvestorPosition(&req, ++iRequestID);
//cerr << "—>>> 请求查询投资者持仓: " << ((iResult == 0) ? “成功” : “失败”) << endl;if (iResult == 0) { JsReqQryInvestorPositionFailer=0; } else { JsReqQryInvestorPositionFailer++; if (JsReqQryInvestorPositionFailer > 20) { printf("请求查询投资者持仓X失败"); } } */
}
bool FindStr(int id, char * str)
{//char * pdest1 = strstr(InstrumentID_n[id], str); //int result1 = pdest1 - InstrumentID_n[id] + 1; //printf("%s %s\n", InstrumentID_n[id], str); //if (stricmp(InstrumentID_n[id], str) == 0) //if (pdest1 != NULL) //{ //printf("在%s发现%s\n", InstrumentID_n[id],str ); return true; //} //else //{ //printf("%s 没有在%s发现\n", str, InstrumentID_n[id]); // return false; //}
}
int SaveInstrumentID = { 0 };
bool checkstate = false;
bool TypeCheckState_B_Today[TYPE_NUM] = { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false };
bool TypeCheckState_S_Today[TYPE_NUM] = { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false };bool TypeCheckState_B_History[TYPE_NUM] = { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false };
bool TypeCheckState_S_History[TYPE_NUM] = { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false };int Trade_dataA_Amount_S_History[TYPE_NUM] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; //空头持仓
int Trade_dataA_Amount_S_Today[TYPE_NUM] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; //空头持仓int Trade_dataA_Amount_B_History[TYPE_NUM] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; //多头持仓
int Trade_dataA_Amount_B_Today[TYPE_NUM] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; //多头持仓//int Trade_dataA_Amount_B_Today = 0; //多头持仓 //int Trade_dataA_Amount_S_Today = 0; //多头持仓
bool orderstate = false;
///请求查询投资者持仓响应
void CTraderSpi::OnRspQryInvestorPosition(CThostFtdcInvestorPositionField *pInvestorPosition, CThostFtdcVirtualApiRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
{}
extern int iRequestID;
extern int MAX_TRADENUM;
extern double totlemoney;void CTraderSpi::ReqOrderInsert(int Sid, char *Instrument, int Volume, double Price, double LastPrice, int Direction, char *Remark)
{
COrderField req;
memset(&req, 0, sizeof(req));
req.Sid = Sid; //策略ID编号
strcpy(req.InstrumentID, Instrument); //股票代码
_snprintf_s(req.Remark, sizeof(req.Remark), sizeof(req.Remark) - 1, “%s”, Remark); //备注,也可以输出策略程序的变量等req.Volume = Volume; //下单数量 req.Price = Price; //委托价格 req.LastPrice = LastPrice; //委托价格 req.Direction = Direction; //买卖方向 int iRequestID = 1; int iResult = pTdApi->ReqOrderInsert(&req, ++iRequestID); cerr << "--->>> 报单录入请求: " << ((iResult == 0) ? "成功" : "失败") << endl;
}
void CTraderSpi::ReqOrderAction(CThostFtdcTradeOrderField *pOrder)
{}
void CTraderSpi::OnRspOrderInsert(COrderField *pInputOrder, CThostFtdcVirtualApiRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
{
cerr << "—>>> " << FUNCTION << endl;SYSTEMTIME sys_time; GetLocalTime(&sys_time); double system_times; system_times = (double)((sys_time.wHour) / 10e1) + (double)((sys_time.wMinute) / 10e3) + (double)((sys_time.wSecond) / 10e5); //格式时间0.145100 //cerr << "--->>> 报单: " <>> " << __FUNCTION__ << endl; if (IsMyOrder(pOrder)) { if (IsTradingOrder(pOrder)) ReqOrderAction(pOrder); else if (pOrder->OrderStatus == THOST_FTDC_OST_Canceled) cout << "--->>> 撤单成功" << endl; }
}
void CTraderSpi::OnFrontDisconnected(int nReason)
{
cerr << "—>>> " << “OnFrontDisconnected” << endl;
cerr << "—>>> Reason = " << nReason << endl;
}void CTraderSpi::OnRspError(CThostFtdcVirtualApiRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
{
cerr << "—>>> " << “OnRspError” << endl;
IsErrorRspInfo(pRspInfo);
}bool CTraderSpi::IsErrorRspInfo(CThostFtdcVirtualApiRspInfoField *pRspInfo)
{
// 如果ErrorID != 0, 说明收到了错误的响应
bool bResult = ((pRspInfo) && (pRspInfo->ErrorID != 0));
if (bResult)
cerr << “—>>> ErrorID=” << pRspInfo->ErrorID << “, ErrorMsg=” << pRspInfo->ErrorMsg << endl;
return bResult;
}bool CTraderSpi::IsMyOrder(CThostFtdcTradeOrderField *pOrder)
{
//return ((pOrder->FrontID == FRONT_ID) &&
//(pOrder->SessionID == SESSION_ID) &&
//(strcmp(pOrder->OrderRef, ORDER_REF) == 0));return (strcmp(pOrder->OrderRef, ORDER_REF) == 0);
}
bool CTraderSpi::IsTradingOrder(CThostFtdcTradeOrderField *pOrder)
{
return ((pOrder->OrderStatus != THOST_FTDC_OST_PartTradedNotQueueing) &&
(pOrder->OrderStatus != THOST_FTDC_OST_Canceled) &&
(pOrder->OrderStatus != THOST_FTDC_OST_AllTraded));
}《Quicklib程序化交易框架www.quicklib.cn》
http://www.mdshare.cn/comm/topic/2750/
《期货跟单软件视频教学4集》
《开户中国期货低佣金开户》
《mdshare财经数据接口包》
《某python量化交易框架性能评测》
《QuicklibTrade A股行情接口,Level2接口》 -
wdg
virtualapi官方网址
http:.//www.virtualapi.cn
virtualapi是一种简单易用的回测方式,这种方式可以在不修改一行代码的情况下进行回测,即回测代码即实盘代码,该方案通过模拟原始API的方式进行回测,回测精度高,支持自定义手续费设置,并申请了国家专利。VNPY,Quicklib,支持C++、python程序、JAVA、C# 等,可以说无所不兼容。并且实盘代码可以在不改动
一行代码前提下实现回测。
VirtualApi申请了国家发明专利,如果有类似CTP API需要VirtualApi 支持期货CTP API接口
CTP API是上海期货交易所的API,支持所有期货公司期货实盘账户和SIMNOW CTP模拟账户
模拟账户注册网址
http://www.simnow.com.cn
实盘期货账户(商品期货、股指期货)开户网址
http://www.kaihucn.cn支持所有自编程序和框架进行回测
Ver2.5
修复穿透式监管版本的API在部分计算机无法回测的问题。
穿透式版本升级至2.5
非穿透式版本保持2.3Ver2.4
提供最新的CTP穿透式版本的VirtualApiVer2.3
增加对查询投资者持仓响应OnRspQryInvestorPosition
增加对查询资金账户响应OnRspQryTradingAccount回调支持Ver2.2
功能升级Ver2.1
修复了MD和TD资金数据同步的Bug
增加配置文件setting.ini,
可以通过修改setting.ini自由设置
(1)初始资金
(2)开仓手续费
(3)平仓手续费
(4)滑点Ver2.0
修复在某些软硬件环境下回测的死锁问题Ver1.1~Ver1.9
完善功能修复BugVer1.0
正式发布《优秀量化资源导航》
《TradeApi A股程序化交易接口》
《酷操盘手期货跟单软件》
python量化交易
《开户中国期货低佣金开户》
《mdshare财经数据接口包》
《某python量化交易框架性能评测》
量化交易资源下载
. -
wdg
量贝金融数据接口官方网站
量贝.A股Level2行情数据接口、金融数据接口
http://www.mdapi.cn以公募量化基金、私募量化基金为核心客户的金融数据产品
量贝数据提供Level2实时数据、历史数据、涵盖A股、基金、债券、指数、衍生品、市场咨询、港股、宏观行业等几十个大表、上百个主题的完整数据产品。
产品1
QTS A股实时行情数据
产品2
QTS指数通
基于QTS接口,通过API接口获取实时行情数据
2万/年产品3
GTA 财经数据库
涵盖A股、基金、债券、指数、衍生品、市场咨询、港股、宏观行业等几十个大表、上百个主题产品4
A股历史数据
自1990年以来所有的Level2历史数据,数据集合庞大,2万/年系统可靠稳定
稳定性高:系统运行高稳定,双系统双备份,保证客户行情稳定和准确。
通信多样:通信既有基于托管机房局域网组播的通信方式,页有互联网和专线的TCP通信方式。
权控灵活:可按市场(7大交易所)、Level1、Level2,逐笔、实时行情、指数、个股代码灵活订阅。
并发量大:单个分发服务可支持全品种10万代码的券消息类型订阅,分发服务支持冰箱和级联扩展。支持的编程语言多样
支持常见的C++、C#、JAVA、Python接口。
支持Windows和Linux《Quicklib程序化交易框架www.quicklib.cn》
http://www.mdshare.cn/comm/topic/2750/
《期货跟单软件视频教学4集》《virtualapi》
《tradeapi》
《酷操盘手期货跟单软件》
《开户中国期货低佣金开户》
《mdshare财经数据接口包》 -
wdg
众所周知,Quicklib 是一款基于 CTP的量化交易开源框架,
今天Quicklib刚刚发布了 CTP期货程序化交易接口穿透式版本2.5,对应的CTP版本位6.3.15,请大家及时更新。
Quicklib官网也做了调整,删除了以前CTP2和资管Python框架的内容,因为马上到年底或2020年初,自主知识产权的资管系统就要发布了。
到时候会提供新的Python资管框架,可以说稳定性和易用性都会比第三方的更加稳定和强大。
对Python的支持也升级到Python3系列
可以说,这次发布的Python3支持CTP穿透式监管的版本将遵循极简的原则,也是将来Quicklib框架遵循的原则。请及时在首页下载
http://www.quicklib.cn
http://www.quicklib.cn/download/Quicklib_ctp_futures_windows.rar
资源打包下载
http://mdshare.cn/source.zipCTP TICK级回测接口官网,这个是极力推荐的
http://www.virtualapi.cn数据是进行量化交易的基础和关键, mdshare提供一种更经济便捷的方式来获取数据, 通过特别的采集工具, 以csv的格式存储,便于后续进行量化交易分析。
提供的工具软件叫 DataCollectServer,这本身是原来Quicklib提供的一个模块,但是已经作为独立产品放到了mdshare中,并100%兼容Virtualapi的字段顺序格式。而资管系统又属于这个系列
http://www.kucps.com/ -
wdg
随着CTP api穿透式监管的实施,老的CTP api已经不再能使用,采集工具更新到最新的CTP API6.3.15,并增加到所有期货品种的采集支持,并采用了无锁队列,进一步提高了稳定性,可以实现365X24小时不间断采集数据。
下载地址
http://mdshare.cn/DataCollect.zip采集的数据100%兼容支持CTP TICK级回测
http://www.virtualapi.cn/
期货实盘开户支持CTP接口上期CTP接口官网,支持实盘和模拟注册
http://www.simnow.com.cn采集的历史数据网盘下载
http://www.pythonpai.com/topic/4206/
4.8
修复郑州交易所2020年以后合约编码错误4.7.0
升级到CTP穿透式API
升级到高性能无锁队列,并提高稳定性
完善对新品种订阅,增加棉纱、苹果、红枣、二债的采集支持4.6.0
升级功能
4.5.0
消除了日志窗口不自动清理导致内存不断增加的BUG,长时间运行内存超过系统限制比如15天以上可能导致程序崩溃的问题。4.3.5
提高了健壮性,对长时间运行遇到异常行情数据导致程序溢出崩溃的问题4.3.3
修复行情分时图显示字段错误
修复周六夜盘0点以后交易日为下周一的日期(csv文件的文件名)4.3.2
更新为按本地日期分类,删除TICK级目录
4.3
修复磁盘写入时,打不开文件可能导致崩溃的问题(之前1个月出现一次)
4.2
完善郑州合约的收集,增加对本月合约的订阅4.1
增加时间流模式的存储,即所有合约按时间顺序记录到一个文件里
时间流模式和合约模式(老的模式)都增加一个字段(本机写入TICK时间)4.0
增加对原油和苹果合约的采集3.9
增加稳定性3.8
增加合约焦炭j,删除无用的settion.ini配置文件中的字段
3.3
修复数据保存时,UpperLimitPrice(涨停板价)
LowerLimitPrice(跌停板价)缺少","作为分隔符的问题3.2
增加了对CTP时间段的过滤
一般每天早上6-8点,从CTP服务器会重复发送前一天夜盘的行情,为了避免重复写入数据,
在配置文件提供了停止存储的时间段(2个时间段),如果不设置的话,默认系统会过滤掉15:30~20:40和3:00~8:40的行情数据,即便接收到行情也不做存储。
可以自行更改3.1
支持盘中实时行情和历史行情连续回播,开盘时间申请到当前行情时间段也不会缺行情,
当数据服务器将文件历史行情回播完成后,开始接着播放实时行情,直到通过python api
调用方法,通知服务器停止回播实时行情。
目前不支持并发,对同一个品种多次调用回播api,会导致回播行情数据顺序错乱。
对不同品种多次调用回播api,可能因为cpu占用过大,会导致服务器UI没有响应。后面升级版本会
完整的并发解决方案。3.0
(1)TCP网络连接由同步模式改为异步模式,解决某些网络状况无法连接数据采集服务器的问题
(2)提供了互联网服务器 data.quicklib.cn 但目前性能未作优化,并不能做大量并发连接。
未来升级版本将优化性能《Quicklib程序化交易框架www.quicklib.cn》
http://www.mdshare.cn/comm/topic/2750/
《期货跟单软件视频教学4集》
《开户中国期货低佣金开户》
《mdshare财经数据接口包》
《某python量化交易框架性能评测》
《QuicklibTrade A股行情接口,Level2接口》 -
wdg
DataCollect数据采集工具4.7重磅更新
下载地址
http://mdshare.cn/DataCollect.zip采集的数据100%兼容支持CTP TICK级回测
http://www.virtualapi.cn/
期货实盘开户支持CTP接口上期CTP接口官网,支持实盘和模拟注册
http://www.simnow.com.cn采集的历史数据网盘下载
http://www.pythonpai.com/topic/4206/4.7.0
升级到CTP穿透式API
升级到高性能无锁队列,并提高稳定性
完善对新品种订阅,增加面纱、苹果、红枣、二债的采集支持4.6.0
升级功能
4.5.0
消除了日志窗口不自动清理导致内存不断增加的BUG,长时间运行内存超过系统限制比如15天以上可能导致程序崩溃的问题。4.3.5
提高了健壮性,对长时间运行遇到异常行情数据导致程序溢出崩溃的问题4.3.3
修复行情分时图显示字段错误
修复周六夜盘0点以后交易日为下周一的日期(csv文件的文件名)4.3.2
更新为按本地日期分类,删除TICK级目录
4.3
修复磁盘写入时,打不开文件可能导致崩溃的问题(之前1个月出现一次)
4.2
完善郑州合约的收集,增加对本月合约的订阅4.1
增加时间流模式的存储,即所有合约按时间顺序记录到一个文件里
时间流模式和合约模式(老的模式)都增加一个字段(本机写入TICK时间)4.0
增加对原油和苹果合约的采集3.9
增加稳定性3.8
增加合约焦炭j,删除无用的settion.ini配置文件中的字段
3.3
修复数据保存时,UpperLimitPrice(涨停板价)
LowerLimitPrice(跌停板价)缺少","作为分隔符的问题3.2
增加了对CTP时间段的过滤
一般每天早上6-8点,从CTP服务器会重复发送前一天夜盘的行情,为了避免重复写入数据,
在配置文件提供了停止存储的时间段(2个时间段),如果不设置的话,默认系统会过滤掉15:30~20:40和3:00~8:40的行情数据,即便接收到行情也不做存储。
可以自行更改3.1
支持盘中实时行情和历史行情连续回播,开盘时间申请到当前行情时间段也不会缺行情,
当数据服务器将文件历史行情回播完成后,开始接着播放实时行情,直到通过python api
调用方法,通知服务器停止回播实时行情。
目前不支持并发,对同一个品种多次调用回播api,会导致回播行情数据顺序错乱。
对不同品种多次调用回播api,可能因为cpu占用过大,会导致服务器UI没有响应。后面升级版本会
完整的并发解决方案。3.0
(1)TCP网络连接由同步模式改为异步模式,解决某些网络状况无法连接数据采集服务器的问题
(2)提供了互联网服务器 data.quicklib.cn 但目前性能未作优化,并不能做大量并发连接。
未来升级版本将优化性能2.9b
清理了不需要的.lib,不会再提示缺少ctp的dll文件,删除了不需要的方法
支持任意IP地址的连接,可以实现连接云主机运行的行情收集服务器,或局域网里的行情收集服务器。2.9
修复了多个API进程之间回调数据时互相影响
当前合约数约323个合约,最大范围1200个合约,视合约产品而定。
本例正式发布版本2.7 可以自由设置行情服务器模拟simnow24小时行情服务器在交易日上午没有数据,要在下午4点之后才有数据。
模拟simnow实盘同步时间服务器,和实盘同步。
可改为期货公司的服务器IP,见“快期”软件设置“测试和代理”中的行情IP地址双击合约文件列表可打开分时图
TestPythonApi可以调用DataCollectServer收集的行情数据(给定合约和时间段)《Quicklib程序化交易框架www.quicklib.cn》
http://www.mdshare.cn/comm/topic/2750/
《期货跟单软件视频教学4集》
《开户中国期货低佣金开户》
《mdshare财经数据接口包》
《某python量化交易框架性能评测》
《QuicklibTrade A股行情接口,Level2接口》 -
wdg
做量化交易的朋友都支持,2019年6月要开始实行穿透式监管了,
老的代码可能不再能够接入,那么如何将老的CTP程序实现升级到穿透式监管呢?本文就讲一下修改的方法。
(1)先替换为最新的CTP api
CTP API下载地址
http://www.simnow.com.cn/static/softwareDownload.actionQuicklib 下载地址
http://www.quicklib.cn/
期货行情数据下载地址
http://www.mdshare.cn
http://www.pythonpai.com/topic/4206/
免费商品期货股指期货跟单系统和资管系统
http://www.kucps.com/
参考代码打包下载
http://mdshare.cn/source.zip
期货低佣金开户
http://www.kaihucn.cn/
期货低佣金开户步骤(交易所标准+1分,交反40%~90%)
http://www.kaihucn.cn/comm/topic/1882/同时免费提供期货APP下单掌上宏源https://mp.weixin.qq.com/s/j_xLax6qM74dcUlM2jZCww
主要涉及以下2个方法
///客户端认证请求 virtual int ReqAuthenticate(CThostFtdcReqAuthenticateField *pReqAuthenticateField, int nRequestID) = 0; ///客户端认证响应 virtual void OnRspAuthenticate(CThostFtdcRspAuthenticateField *pRspAuthenticateField, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
这2个方法分别是:客户端认证响应和客户端认证请求。
(2)代码方面的修改:
之前大家做CTP都需要调用ReqUserLogin();这个登录请求,现在如果要接入穿透式监管的流程改变了,请将ReqUserLogin();替换为ReqAuthenticate(CThostFtdcReqAuthenticateField *pReqAuthenticateField, int nRequestID) 认证请求,然后在认证回调里添加ReqUserLogin();
简单的说代码修改流程即为:
1.把以前登录请求替换为认证请求
2.就是把登录请求放到认证回调里
即先认证再登录
向期货公司申请获得信息
在认证请求的结构体定义如下:///客户端认证响应 struct CThostFtdcRspAuthenticateField { ///经纪公司代码 TThostFtdcBrokerIDType BrokerID; ///用户代码 TThostFtdcUserIDType UserID; ///用户端产品信息 TThostFtdcProductInfoType UserProductInfo; ///App代码 TThostFtdcAppIDType AppID; ///App类型 TThostFtdcAppTypeType AppType; };
(3)认证的函数定义
ReqAuthenticate(UserProductInfo, AuthCode); void CTraderSpi::ReqAuthenticate(const char *UserProductInfo,const char *AuthCode) { if(pUserApi[accountid] == NULL ){return;} //认证码 CThostFtdcReqAuthenticateField pReqAuthenticateField; memset(&pReqAuthenticateField, 0, sizeof(CThostFtdcReqAuthenticateField)); strcpy(pReqAuthenticateField.BrokerID, BROKER_ID); strcpy(pReqAuthenticateField.UserID, INVESTOR_ID); strcpy(pReqAuthenticateField.UserProductInfo, UserProductInfo); //产品标识 strcpy(pReqAuthenticateField.AuthCode, AuthCode); //认证码 int iResult = pUserApi[accountid]->ReqAuthenticate(&pReqAuthenticateField, ++iRequestID); cerr << "--->>> 发送认证请求: " << ((iResult == 0) ? "成功" : "失败") << endl; }
其中产品信息UserProductInfo、AppID、AppType
需要通过咨询期货公司获得。《Quicklib程序化交易框架www.quicklib.cn》
http://www.mdshare.cn/comm/topic/2750/《优秀量化资源导航》
《TradeApi A股程序化交易接口》
《酷操盘手期货跟单软件》
《开户中国期货低佣金开户》
《mdshare财经数据接口包》
《QuicklibTrade A股行情接口,Level2接口》
《期货跟单软件视频教学4集》
python量化交易 -
wdg
《大连期货交易所手续费标准公布》 首页 > 业务/服务 > 业务参数 > 交易参数 > 交易参数表
《上海期货交易所手续费标准公布》 点上市品种->交易参数
《郑州期货交易所手续费标准公布》 首页 >> 交易数据 >> 结算参数按以下步骤在宏源期货开户获得返佣和手续费优惠
交易所基础加1分钱,例如铝交易所标准是3.00元的话,那么加收0.01元,盘中收3.01元。
交易所返佣按3.00的40%返佣,这部分的40-80%反给客户的银行卡,但需要扣除3项费用(企业税金,保证准备金,个人所得税),这3项费用全国期货公司扣除标准都是按国家法律法规扣除,都基本上是统一标准。返佣(全国通用标准公式)=交易所标准手续费X交反比例X(1-企业税金-保证准备金)X(1-个人所得税)X 返佣比例
考虑到税费,最终返佣在手续费的10-30%之间
宏源期货开户步骤
1.在应用宝下载开户云APP
https://sj.qq.com/myapp/detail.htm?apkName=com.cfmmc.app.sjkh
开户云App是中国期货保证金中心提供的期货开户App
或下方二维码下载“开户云”APP
2.运行开户云APP进行开户,输入“宏源期货”或输入宏源期货的经纪人代码 :1080,开户过程中营业部选“重庆营业部
3.开户过程中填写居间人 或推荐人 :上海量贝信息科技有限公司
推荐人电话填: 13761072805
4.按APP提示一步步走下去即可
5.银期转账,网络办理银期或去银行柜台办理银期转账
6.账户开通完成,会收到宏源期货公司的短信后,告知QQ147423661(QQ群 5172183的群主) 群主会帮助协调调整手续费用
联系群主后,请按下面步骤调整佣金和保证金
宏源期货手续费调整步骤
告知QQ147423661协调调整手续费
宏源期货开户完成后,收到短信里有资金帐号信息
密码的话是身份证的后6位默认的身份证后6位。如果说有字母的话,就向前面1位。
收到那个短信了以后,都可以现在都可以交易,都可以用的都可以入金。
调手续费:交易所标准加1分钱,并且有返佣40-80%
机构客户可打电话给13761072805协商宏源期货提供免费的手机APP
文华随身行已经开始收费,宏源期货提供自主研发的免费的手机APP,支持止盈止损和条件单功能
《掌上宏源使用攻略5.0 | 止盈止损、条件单,我们来咯!》====================================================
宏源期货保证金调整步骤
将以下文件打印,签字,拍照发给QQ147423661
调保证金:最低可调到交易所标准+1%如果需要调低保证金(交易所标准+1%),需入金10万以上(只针对保证金调整,对开户没有资金要求),然后填写《宏源期货调低保证金申请》
打印、拍照、发给群主
《宏源期货调低保证金申请.pdf》宏源期货CTP 配置
宏源期货重置密码步骤
将以下文件打印,签字,邮寄
《宏源期货有限公司客户重置期货密码申请表.pdf》 -
wdg
菲利普·格雷特(Philippe Grenet)是一名在EA爱尔兰分部上班的高管,掌管着爱尔兰分部420名雇员,以及位于美国德州奥斯汀的另外80人。
格兰特并不承认他说要比大小,称原话是不与同事比长度。格兰特又称那个女人一直觊觎他的位子,自从落选就一直试图挑战他的权威,还在同事中挑拨关系,自己当时口出秽语是提醒对方不要痴心妄想。
格雷特上月9号与位于奥斯汀的女下属进行一对一视讯通话,被后者投诉人身攻击及性骚扰。据称这位男上司在通话中声称他没蠢到要与女人比大小:”我不会把xx掏出来放在桌上,看谁的更大。“可惜公司并不在意他的说法,现在风声这么紧,开除了事。上月14号格雷特被告知因违反公司的反性骚扰及反歧视原则已被解除劳动合同。
这可苦了56岁的格雷特,他本是法国人,为了事业从法国跑到寒风呼啸的爱尔兰,年初还把儿子接来安家。因为这种指控丢了工作等于在事业上被判死刑。
他决定诉诸法律,当地法院已接纳格雷特的诉状并签发临时禁令,禁止公司开除格雷特,且禁止公司安排任何人顶替格雷特的位置,以免某人得逞。
EA发表声明称解雇决定并无不妥之处,公司致力于提供安全祥和的工作环境并反对任何形式的歧视及骚扰。
禁令的有效期至本案下周开庭为止。格雷特的律师称当事人的母语并非英语,有人蓄意扭曲当时语境意在借此搞掉他的当事人。EA高管要比长度
另外,因驾车冲撞游行队伍导致一人死亡多人受伤的James Alex Fields Jr.被判一级谋杀罪成立。
EA高管要比长度
这名21岁的白人至上主义者去年夏天驾车从俄亥俄跑到弗吉尼亚的夏洛茨维尔(Charlottesville)去支持白人至上团体集会。反种族主义团体到场与白人至上主义者发生冲突,Fields停下来并倒车拉开距离,然后加速朝人群冲去,导致32岁的民权活动家Heather Heyer当场死亡,三十多人受伤。
公诉人向陪审团出示了Fields发表在Instagram上的图片,图片内容是许多人被一辆车撞飞,图片发表于集会事件三个月前。
Fields的老师作证说,Fields高中时就崇拜希特勒,对纳粹顶礼膜拜。就在集会事件数天前,Fields给母亲发去一条短信,其中包含纳粹万字标识。母亲告诫他要小心,Fields不屑地回应说,“我们才不是应该小心的那一方。”
EA高管要比长度法庭将于周一开庭宣判。根据弗吉尼亚法律,一级谋杀罪刑期20年起,可至终身监禁;若有从重情节,即因为仇恨(种族、宗教、性别、性取向、残障歧视等)杀人,则可判死刑。
陪审团根据以上证人证言一致同意被告一级谋杀罪名成立,外加蓄意伤害及肇事逃逸等八项罪名。法庭外受害者家庭成员获知陪审团结论后相拥而泣:《酷操盘手期货跟单软件》
《开户中国期货低佣金开户》
《mdshare财经数据接口包》
《某python量化交易框架性能评测》《量化行业的神狗模式》
python量化交易
《Quicklib程序化交易框架www.quicklib.cn》
http://www.mdshare.cn/comm/topic/2750/
《期货跟单软件视频教学4集》 -
wdg
来自央视消息,针对自媒体“网络水军”敲诈勒索等违法犯罪活动突出的情况,今年以来,公安部成功侦破自媒体“网络水军”团伙犯罪案件28起,抓获犯罪嫌疑人67名,部分涉案人员已经被人民法院判处有期徒刑。
有偿删帖、发帖、灌水……网络水军普遍从事编造虚假信息、诽谤攻击、非法推广等违法活动,严重侵害他人权利。
此外,关闭涉案网站31家,关闭各类网络大V账号1100余个,涉及被敲诈勒索的企事业单位80余家。据介绍,自媒体“网络水军”的盈利模式主要有四种:一是有偿删帖,胁迫涉事人员和企事业单位出钱“了事”。二是有偿发帖。三是非法广告宣传。通过雇用的“网络水军”,并依托有关系的“网络大V”、知名博主、论坛版主、网红等,为“客户”转发非法广告。四是恶意传播木马病毒。通过将木马植入网页,提高网页点击率以博取广告商“眼球”。
《Quicklib程序化交易框架www.quicklib.cn》
http://www.mdshare.cn/comm/topic/2750/
《期货跟单软件视频教学4集》《量化界社区http://www.lhjie.net》
《酷操盘手期货跟单软件》
《开户中国期货低佣金开户》
《mdshare财经数据接口包》
《某python量化交易框架性能评测》