|
基础函数和属性取值,构成了mt5ctp的主体结构,下面我们就开始使用这些基础构件实现我们想要的功能,因为技术指标的开发均使用mt5的原生函数,所以我们只对策略EA做介绍。
1)显示数据:取出数据并打印到界面,即界面实时显示/更新我们关心的数据。Demo文件目录[Experts/mt5ctp/demo/account_info.mq5]。摘录其中的部分:
CTP::AccountInfoInteger(CTP::ACCOUNT_FrontID),
CTP::AccountInfoInteger(CTP::ACCOUNT_SessionID),
CTP::AccountInfoInteger(CTP::ACCOUNT_SettlementID),
CTP::AccountInfoInteger(CTP::ACCOUNT_BizType),
CTP::AccountInfoString(CTP::ACCOUNT_TradingDay),
CTP::AccountInfoString(CTP::ACCOUNT_LoginTime),
CTP::AccountInfoString(CTP::ACCOUNT_BrokerID),
CTP::AccountInfoString(CTP::ACCOUNT_UserID),
CTP::AccountInfoString(CTP::ACCOUNT_AccountID),
CTP::AccountInfoString(CTP::ACCOUNT_SystemName),
CTP::AccountInfoString(CTP::ACCOUNT_MaxOrderRef),
其中调用函数前面的CTP::是命名空间,与属性字段前面的CTP::是一致的,也就是说我们使用mt5ctp提供的函数和对应的属性取值时,要明确的指定我们使用的命名空间,其他的基础函数的调用规则与此一致。没有什么歧义,漏掉使用命名空间,编译时会有错误提示,唯一的遗憾就是不够优雅,有点啰嗦,这促使我们提供了类的封装,后面专门一个章节介绍。
2)查找订单/历史订单/持仓/成交
int order_index =CTP:: OrdersTotal();
for(;order_index>0;order_index--)
{
if(!CTP::OrderSelect(order_index)) contiume;
//do somthing
}
这个是查找并锁定/提取整条信息的一般结构,对订单/持仓/历史订单/成交信息都类似,有个小问题需要注意,就是order_index的取值范围不是从0开始,而是从1开始,即取值范围是[1,CTP:: OrdersTotal()],这是为什么呢?在报单的结构体MqlTradeRequest中我们初始化的时候会将结构体的变量赋值为0,其中就有order/position/position_by等变量,如果index从0开始,可能会引起混乱,所以我们的序号都是从1开始。这显著区别于mt5原生函数的使用规则。
3)选择订单/历史订单/持仓/成交
mt5ctp中我们使用两种选择订单的方式,CTP::OrderSelect(int index)是通过持仓序号选中订单,因为持仓/订单的变化,这个序号不是固定不变的。与原生mt5显著不同就是ticket字段,ticket在mt5中是long类型,在mt5ctp中是string类型,用于表示c++Map类型的key。也就是说我们使用CTP::OrderSelectByTicket(string ticket)时,实际使用了ticket作为key来查找c++的Map。选中一条订单,实际上是是做了一个订单的拷贝,将订单信息拷贝到mt5ctp环境,所以使用基础函数的时候,同时只能操作一个订单,这显然缺少灵活性,特别是做套利和对冲交易的时候。类封装操作更加完善了这部分内容,可以毫无顾忌的同时操作多个订单,多个对象。
CTP::OrderGetTicket(int index),CTP::OrderGetIndex(string ticket)是互换函数,可以实现index与ticket互相调用。
作者:MT5CTP
链接:https://zhuanlan.zhihu.com/p/164639164
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
4)可以选中我需要的订单/历史订单/持仓/成交,可以提取选中订单/历史订单/持仓/成交的数据,那就可以操作这些订单/历史订单/持仓/成交了,报单/撤单/修改挂单等操作,与mt5一样只有两个基础函数:CTP::OrderCheck(MqlTradeRequest& request, MqlTradeCheckResult& result)和CTP::OrderSend(MqlTradeRequest& request, MqlTradeResult& result),使用方法,变量类型与mt5ctp一致。
(mt5ctptools-交易界面的功能实现,全部使用了mt5ctp的基础函数,后续开源供爱好者学习、研究和更新)
使用方法:
//+------------------------------------------------------------------+
//| 买入开仓
void OnStart() {//--- 声明并初始化交易请求和交易请求结果MqlTradeRequest request={0};MqlTradeResult result={0};//--- 请求的参数
request.action =TRADE_ACTION_DEAL; // 交易操作类型request.symbol =Symbol(); // 交易合约request.volume =(double)1; // 1手交易量 request.type =ORDER_TYPE_BUY; // 订单类型request.price =SymbolInfoDouble(Symbol(),SYMBOL_ASK); // 对手价报单
或者:CTP::SymbolInfoDouble(Symbol(),CTP::SYMBOL_AskPrice1); // 对手价报单request.deviation=5; // 允许价格偏差request.type_filling = ORDER_FILLING_RETURN; // 命令执行类型//--- 发送请求if(!CTP::OrderSend(request,result))
Print(“CTP order error.”);
}//+------------------------------------------------------------------+
//|卖出开仓
void OnStart() {//--- 声明并初始化交易请求和交易请求结果MqlTradeRequest request={0};MqlTradeResult result={0};//--- 请求的参数
request.action =TRADE_ACTION_DEAL; // 交易操作类型request.symbol =Symbol(); // 交易合约request.volume =(double)1; // 1手交易量 request.type =ORDER_TYPE_SELL; // 订单类型request.price =SymbolInfoDouble(Symbol(),SYMBOL_BID); // 对手价报单
或者:CTP::SymbolInfoDouble(Symbol(),CTP::SYMBOL_BidPrice1); // 对手价报单request.deviation=5; // 允许价格偏差request.type_filling = ORDER_FILLING_RETURN; // 命令执行类型//--- 发送请求if(!CTP::OrderSend(request,result))
Print(“CTP order error.”);
}//+------------------------------------------------------------------+
//|全部平仓
void OnStart() {//--- 声明并初始化交易请求和交易请求结果MqlTradeRequest request={0};MqlTradeResult result={0};
//---遍历持仓
int pos = CTP::PositionsTotal();
for(;pos>0;pos--)
{
if(!CTP::PosiotionSelect(pos)) continue;
string pos_symbol = CTP::PositionInfoString(POSITION_InstrumentID);
long pos_volume = CTP::PositionInfoInteger(POSIOTION_Position);
if(pos_volume<=0) continue;
ZeroMemory(request);
ZeroMemory(result);
//--- 请求的参数
request.action =TRADE_ACTION_DEAL; // 交易操作类型request.symbol =pos_symbol; // 交易合约
Request.position = pos; // 持仓序号
request.volume =(double)pos_volume; // 交易量
request.price=SymbolInfoDouble(pos_symbol,SYMBOL_Last); //最新价报单
或者:CTP::SymbolInfoDouble(Symbol(),CTP::SYMBOL_LastPrice); // 最新价报单
request.deviation=5; // 允许价格偏差request.type_filling = ORDER_FILLING_RETURN; // 命令执行类型
//--- 发送请求
if(!CTP::OrderSend(request,result))
Print(“CTP order error.”);
// 简单流控100笔/秒
Sleep(10);
} //for
}
//+------------------------------------------------------------------+
(未完待续)
声明:以上内容来源于网络,如有侵权请联系我们(123@shiyan.com)删除! |
|