MqlTradeRequest
订单发送请求体,向交易服务器发送订单操作数据信息
属性 | 说明 | 数据类型 |
---|---|---|
action | 请求操作订单的类型(新增,修改,更新,删除,平仓,反向平仓 操作模式) | ENUM_TRADE_REQUEST_ACTIONS |
magic | 订单识别号(相当于一个或者一组订单的识别号) | ulong |
order | 对已经存在的订单进行操作时需要填写 | ulong |
symbol | 新增订单时,需要指定交易品种 | string |
volume | 新增订单时是下单的手数,对存在订单时可以部分平仓或者删除 | double |
price | 下单时的设置交易价格,挂单操作时可以修改交易价格 | double |
stoplimit | 挂单操作时设置的止损价格 | double |
sl | 下单时设置的止损价格, 也可以修改订单或修改挂单时修改 | double |
tp | 下单时设置的止盈价格,也可以修改订单或修改挂单时修改 | double |
deviation | 可承受订单成交价格和市场价存在的偏差值 | ulong |
type | 下单和挂单方向模式,包含: 做多单, 做空单, 挂抄底单, 挂突破单模式 | ENUM_ORDER_TYPE |
type_filling | 下单和挂单执行成交模式 | ENUM_ORDER_TYPE_FILLING |
type_time | 挂单时日期时间模式,比如: 挂单永久存在,隔日删除,指定多少天删除 | ENUM_ORDER_TYPE_TIME |
expiration | 挂单到期时间 | datetime |
comment | 订单注释 | string |
position | 操作已经存在的订单ID号 | ulong |
position_by | 反向持仓的订单ID号 | ulong |
MqlTradeResult
订单回执响应体,交易服务器响应操作后返回回执订单数据信息
属性 | 说明 | 数据类型 |
---|---|---|
retcode | response code 交易服务器返回状态码 | uint |
deal | 交易订单号(如果下单成功) | ulong |
order | 挂单订单号(如果挂单成功) | ulong |
volume | 订单手数 | double |
price | 订单开仓价格 | double |
bid | 交易服务器当前做空的价格 | double |
ask | 交易服务器当前做多价格 | double |
comment | 订单注释 | string |
request_id | 通过程序端设置Request ID | uint |
retcode_external | 返回外部交易系统代码 | uint |
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link "https://www.mql5.com"
#property version "1.00"
// 1. 创建交易品种信息结构体
struct SymbolInfo
{
double ask; // buy方向报价
double bid; // sell方向报价
double point; // 最小报价单位
int digits; // 小数点的位数
int spread; // 点差
ENUM_ORDER_TYPE_FILLING filling_mode; // 订单模式
int stops_level; // 止损价和报价之间最小的间距点数
};
void OnStart()
{
string sym = _Symbol;
SymbolInfo sym_info;
// 创建交易请求体和响应体
MqlTradeRequest request;
ZeroMemory(request);
MqlTradeResult result;
ZeroMemory(result);
// 判断货币是否存在,存在即获取信息
bool is_exits = getSymbolInfo(sym, sym_info);
if(is_exits)
{
/*
执行
交易品种
交易量
价格
止损水平
盈利水平
误差
类型
_filling类型
*/
// 请求设置相关属性
request.action = TRADE_ACTION_DEAL; // 交易模式
request.type = ORDER_TYPE_BUY; // 下单方向
request.type_filling = sym_info.filling_mode; //订单模式
// 订单设置相关属性
request.symbol = sym;
request.comment = "这是Buy单";
request.magic = 8199231;
// 价格相关属性
request.volume = 0.1; // 下单手数
request.price = sym_info.ask; // 下单价格
request.sl = 0.0; // 止损
request.tp = 0.0; // 止盈
request.deviation = 0; // 允许滑点范围
if(OrderSend(request, result))
{
printf("状态码:%d, 订单号: %d, 开仓价: %.5f, 下单手数: %.2f, 交易返回注释: %s"
,
result.retcode,
result.deal,
result.price,
result.volume,
result.comment
);
}
else
{
printf("发送交易请求失败,错误代码: %d",GetLastError());
}
}
else
{
printf("交易品种: %s, 不存在!", sym);
}
}
// 2. 获取指定交易品种的信息
bool getSymbolInfo(const string symbol, SymbolInfo & symbol_info)
{
bool is_exsit = SymbolSelect(symbol,true);
if(is_exsit)
{
symbol_info.ask = SymbolInfoDouble(symbol, SYMBOL_ASK);
symbol_info.bid = SymbolInfoDouble(symbol, SYMBOL_BID);
symbol_info.point = SymbolInfoDouble(symbol, SYMBOL_POINT);
symbol_info.digits = (int)SymbolInfoInteger(symbol, SYMBOL_DIGITS);
symbol_info.spread = (int)SymbolInfoInteger(symbol, SYMBOL_SPREAD);
symbol_info.filling_mode =
(ENUM_ORDER_TYPE_FILLING)SymbolInfoInteger(symbol, SYMBOL_FILLING_MODE);
symbol_info.stops_level = (int)SymbolInfoInteger(symbol, SYMBOL_TRADE_STOPS_LEVEL);
}
return is_exsit;
}