用C++写一个期货交易策略
时间: 2023-12-27 12:14:59 浏览: 27
期货交易策略的实现需要结合市场行情和交易规则进行分析和计算,具体的实现方式也会因为不同的交易所和品种而有所不同。以下是一个简单的期货交易策略示例,仅供参考:
```c++
#include<iostream>
#include<fstream>
#include<cmath>
#include<vector>
#include<queue>
using namespace std;
//定义交易数据结构体
struct trade{
int day; //交易日期
double open; //开盘价
double close; //收盘价
double high; //最高价
double low; //最低价
double volume; //成交量
};
//读取交易数据函数
vector<trade> readData(string filename){
vector<trade> data;
ifstream fin(filename);
if(!fin.is_open()){
cout<<"Error opening file"<<endl;
return data;
}
string line;
getline(fin, line); //忽略第一行表头
while(getline(fin, line)){
trade t;
sscanf(line.c_str(), "%d,%lf,%lf,%lf,%lf,%lf", &t.day, &t.open, &t.high, &t.low, &t.close, &t.volume);
data.push_back(t);
}
fin.close();
return data;
}
//计算移动平均线
vector<double> calMA(vector<double> prices, int window){
vector<double> ma;
queue<double> windowPrices;
double sum = 0;
for(int i=0; i<prices.size(); i++){
if(windowPrices.size() < window){
sum += prices[i];
windowPrices.push(prices[i]);
}else{
sum -= windowPrices.front();
windowPrices.pop();
sum += prices[i];
windowPrices.push(prices[i]);
}
ma.push_back(sum/windowPrices.size());
}
return ma;
}
//计算均线交叉信号
vector<int> calSignal(vector<double> ma5, vector<double> ma10){
vector<int> signal;
for(int i=0; i<ma5.size(); i++){
if(ma5[i] > ma10[i]){
signal.push_back(1); //金叉信号
}else if(ma5[i] < ma10[i]){
signal.push_back(-1); //死叉信号
}else{
signal.push_back(0); //无信号
}
}
return signal;
}
//简单止损策略
int stopLoss(double buyPrice, double closePrice){
if(closePrice < buyPrice*0.95){
return -1; //止损信号
}
return 0;
}
//简单止盈策略
int takeProfit(double buyPrice, double closePrice){
if(closePrice > buyPrice*1.05){
return 1; //止盈信号
}
return 0;
}
//期货交易策略函数
vector<int> trading(vector<trade> data){
vector<double> closePrices;
for(int i=0; i<data.size(); i++){
closePrices.push_back(data[i].close);
}
vector<double> ma5 = calMA(closePrices, 5);
vector<double> ma10 = calMA(closePrices, 10);
vector<int> signal = calSignal(ma5, ma10);
vector<int> action(signal.size(), 0); //交易信号
int position = 0; //持仓情况,0表示无持仓,1表示持有多头,-1表示持有空头
double buyPrice = 0; //买入价格
for(int i=1; i<signal.size(); i++){
if(signal[i-1] == 0 && signal[i] == 1 && position == 0){
action[i] = 1; //买入信号
position = 1;
buyPrice = data[i].close;
}else if(signal[i-1] == 0 && signal[i] == -1 && position == 0){
action[i] = -1; //卖空信号
position = -1;
buyPrice = data[i].close;
}else if(signal[i-1] == 1 && signal[i] == -1 && position == 1){
action[i] = -1; //卖出信号
position = 0;
}else if(signal[i-1] == -1 && signal[i] == 1 && position == -1){
action[i] = 1; //买回信号
position = 0;
}
//止损止盈策略
if(position == 1){
int stop = stopLoss(buyPrice, data[i].close);
if(stop == -1){
action[i] = -1;
position = 0;
}else{
int profit = takeProfit(buyPrice, data[i].close);
if(profit == 1){
action[i] = -1;
position = 0;
}
}
}else if(position == -1){
int stop = stopLoss(buyPrice, data[i].close);
if(stop == -1){
action[i] = 1;
position = 0;
}else{
int profit = takeProfit(buyPrice, data[i].close);
if(profit == 1){
action[i] = 1;
position = 0;
}
}
}
}
return action;
}
int main(){
string filename = "data.csv";
vector<trade> data = readData(filename);
vector<int> action = trading(data);
for(int i=0; i<action.size(); i++){
cout<<data[i].day<<" "<<action[i]<<endl;
}
return 0;
}
```
这个示例使用了移动平均线和简单的止损止盈策略。在实际交易中,还需要考虑更多的因素,比如市场风险、交易成本等等。因此,在进行实际交易之前,一定要对交易策略进行严格的测试和验证。