微信登录
注册忘记密码
查看: 1402|回复: 0

MT5CTP策略(EA)篇(四)

[复制链接]

该用户从未签到

发表于 2022-6-1 09:01:27 | 显示全部楼层 |阅读模式
基础函数和属性取值,构成了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)删除!

发表回复

您需要登录后才可以回帖 登录 | 立即注册 微信登录

本版积分规则