MT5 EA交易期货-市价单开仓平仓

该例子演示了EA如何报期货市价单开仓,开仓后10秒钟报市价单平仓。

在外汇交易里没有市价单,而期货交易有市价单,

市价单报单时不指定价格,让交易所自行成交,就是做多无论多贵都买,做空无论多便宜都卖,不管价格高低只求成交。

比方说日内交易者在市场收盘前会报市价单平掉当天仓位, 又或者当仓位亏损后报市价单平仓止损。

市价单不是每个期货交易所都支持,对于不支持的交易所我们可以用涨停跌停价格报限价单实现市价单效果。

模拟SIMNOW不支持市价单。

EA是通过调用mt5ctp.dll进行期货交易,所以EA需要先引用mt5ctp.dll的头文件mt5ctp.mqh,该头文件在\MQL5\Include目录下。

#property copyright "www.wewin28.com 1145412@qq.com"
#property link      "http://www.wewin28.com"
#property version   "1.2"
#include <mt5ctp.mqh>   //引用MT5CTP头文件

EA获取当前图表的合约。对于非主连合约如rb2209可以通过Symbol()属性获得当前图表的合约,但对于主连合约如rb9999,则需要通过SYMBOL_ISIN属性获得主连合约现在对应的合约(rb2301),当主连合约rb9999随着时间发生换月后,通过SYMBOL_ISIN属性得到的合约就会自动变为rb2305。使用后者的写法可以让EA在主连合约和非主连合约的图表上都能获得当前图表的合约。

通过SYMBOL_EXCHANGE属性获得该合约对应的交易所, 如获得rb2301所属的交易所SHFE即上期所。

通过SYMBOL_DIGITS属性获得该合约报价的小数后位数,如螺纹钢是0,股指是1。

splitCommma是代表逗号。

string symbol=SymbolInfoString(Symbol(), SYMBOL_ISIN); //获取合约(如果是主力合约的话取对应的合约)
string exchange=SymbolInfoString(Symbol(), SYMBOL_EXCHANGE); //该品种的交易所
long digits=SymbolInfoInteger(symbol, SYMBOL_DIGITS);  //该品种价格的小数位数  get decimal
ushort splitCommma=StringGetCharacter(",",0);

定义报单时间全局变量entryTime,用来判断是否已经报单。

定义仓位全局变量,如果pos等于0就是空仓,如果大于0就是持仓。

eaOrderRef是EA报单编号,作用类似外汇EA的魔术号码。

datetime entryTime=D'1970.01.01 00:00';  //报单时间全局变量
int pos=0;  //EA仓位全局变量
long eaOrderRef=0;   //EA报单编号全局变量

如果还没报单还是空仓,就报单手数1手。

调用mt5ctp.dll getOrderRefCTP接口函数生成EA报单编号并保存在eaOrderRef变量,CTP对报单编号格式有规定,不能像外汇EA的魔术号码可随意自行指定, 否则报单会失败,所以EA需先调用getOrderRefCTP函数生成EA报单编号再报单。

上期所、能源中心和中金所不支持市价单,所以如果是这些交易所的合约用涨停价报限价单实现市价单功能。

通过SYMBOL_SESSION_PRICE_LIMIT_MAX属性获得合约的涨停价。

大商所和郑商所支持市价单,如果是这些交易所的合约调用mt5ctp.dll sendOrderMarket接口函数报市价单。

调用mt5ctp.dll sendOrderLimit接口函数用涨停价报限价单,其中第一个参数是合约,第二个参数是mt5ctp.mqh头文件中定义的枚举ENUM_CTP_BUY_ORDER(代表多单),第三个参数是mt5ctp.mqh头文件中定义的枚举ENUM_CTP_OPEN_POSITION(代表开仓),第四个参数是报单的价格(涨停价),第五个参数是报单的手数,第六个参数是EA报单编号,第七个参数是mt5ctp.mqh头文件中定义的枚举ENUM_CTP_ACCOUNT_SPECULATION(代表开户的期货账号是投机)。

void OnTick(){if(entryTime==D'1970.01.01 00:00'){if(pos==0)     //空仓 {      int vol=1;   //手数 quantity            eaOrderRef=getOrderRefCTP(); //生成ea报单编号 generate ea magic numberif(exchange=="SHFE" || exchange=="INE" || exchange=="CFFEX"){double priceLimitMax=SymbolInfoDouble(symbol, SYMBOL_SESSION_PRICE_LIMIT_MAX);int res=sendOrderLimit(symbol, ENUM_CTP_BUY_ORDER, ENUM_CTP_OPEN_POSITION, priceLimitMax, vol, (string)eaOrderRef, ENUM_CTP_ACCOUNT_SPECULATION);   //发涨停价限价单多开  send buy limit order with daily max price//0 代表报单成功 local send order ok //-1 表示网络连接失败  network disconect//-2,表示未处理请求超过许可数 request too much   //-3,表示每秒发送请求数超过许可数 request too fast in one secondif(res!=0){printf("sendOrderLimit error %s", res);}          }else{int res=sendOrderMarket(symbol, ENUM_CTP_BUY_ORDER, ENUM_CTP_OPEN_POSITION, vol, (string)eaOrderRef, ENUM_CTP_ACCOUNT_SPECULATION);   //市价单多开  market order buyif(res!=0){printf("sendOrderMarket error %s", res);}       }}   }

sendOrderLimit函数调用后会同步返回本地电脑发送报单请求的结果,0是本地电脑向交易所成功发送报单,-1是网络连接失败,-2是未处理请求超过许可数,-3是每秒发送请求数超过许可数。但即使sendOrderLimit函数返回0(只是完成了下图中的1和2),也不代表已经成功在交易所挂单,还需要等待交易所异步返回对EA报单的撮合结果即报单回调和成交回调(下图中的3)MT5通过mt5ctp.dll得到交易所的各种回调(如报单回调,成交回调,撤单回调,错误回调,仓位回调,资金回调),之后会把这些回调作为图表事件发送给全部图表,EA 通过MQL图表事件响应函数OnChartEvent得到这些回调(即下图中的4)。


成交10秒之后报市价单平仓,调用mt5ctp.dll getOrderRefCTP接口函数生成EA报单编号并保存在eaOrderRef变量,CTP对报单编号格式有规定,不能像外汇EA的魔术号码可随意自行指定, 否则报单会失败,所以EA需先调用getOrderRefCTP函数生成EA报单编号再报单。

上期所、能源中心和中金所没有市价单,所以这些交易所的合约用跌停价报限价单实现市价单功能。

通过SYMBOL_SESSION_PRICE_LIMIT_MIN属性获得当前跌停价。

用跌停价报空单(平多仓)。

大商所和郑商所支持市价单,如果是这些交易所的合约报市价单平仓。

if(pos!=0)     //持仓10秒后市价平仓  close position in 10 seconds by marking order{if(TimeCurrent()-entryTime>10)  //10秒后平仓 close position in 10 seconds {        eaOrderRef=getOrderRefCTP(); //生成ea报单编号 generate ea order magic numberif(exchange=="SHFE" || exchange=="INE" || exchange=="CFFEX"){double priceLimitMin=SymbolInfoDouble(symbol, SYMBOL_SESSION_PRICE_LIMIT_MIN);int res=sendOrderLimit(symbol, ENUM_CTP_SELL_ORDER, ENUM_CTP_CLOSE_POSITION, priceLimitMin, pos, (string)eaOrderRef, ENUM_CTP_ACCOUNT_SPECULATION); //发跌停价限价单空平 send sell limit order with daily min priceif(res!=0){printf("sendOrderLimit error %s", res);}    }else{int res=sendOrderMarket(symbol, ENUM_CTP_SELL_ORDER, ENUM_CTP_CLOSE_POSITION, pos, (string)eaOrderRef, ENUM_CTP_ACCOUNT_SPECULATION);  //市价单空平  market order sellif(res!=0){printf("sendOrderMarket error %s", res);}  }      }   }  

EA报单后通过mt5ctp.dll得到交易所对该报单撮合的结果即报单回调,然后mt5ctp.dll会把该报单回调作为图表事件发送给全部图表,EA 通过MQL图表事件响应函数OnChartEvent得到该报单的结果。

MT5期货发出的MQL图表事件的ID都是3000,EA需要在OnChartEvent函数中只处理ID是3000的事件。

void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
{if(id==3000)     //只处理MT5 CTP的事件 process MT5 CTP event only{      

EA通过OnChartEvent函数的sparam参数获得图表事件中的交易所报单回调。

报单回调是一个字符串,格式如下:

OnRtnOrder, 交易所, 合约, EA报单编号, CTP报单编号, 多空, 开平, 报单状态枚举, 报单状态信息, 报单价格, 报单手数, 成交手数, 报单时间, 撤单时间,FrontID,SessionID,e

EA通过OnChartEvent函数的sparam参数获得图表事件中的交易所报单回调。把sparam对应的字符串按逗号拆分后保存到字符数组chartEvents[]。

因为在OnChartEvent函数中ID是3000的事件包括了各种的交易所回调(如报单回调,成交回调,撤单回调,错误回调,仓位回调,资金回调), 所以EA需要先根据chartEvents[0]="OnRtnOrder"找出其中的报单回调。

void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
{if(id==3000)     //只处理MT5 CTP的事件 process MT5 CTP event only{      string chartEvents[];     int n=StringSplit(sparam,splitCommma,chartEvents);   //CTP成交回调中的各个数据用逗号分隔  callback string split by commaif(n>0){string eventType=chartEvents[0];   if(eventType=="OnRtnOrder")    //CTP报单回调 send order callback{

获得报单回调中的EA报单编号。

chartEvents数组的第4个元素是EA报单编号。如果有多个EA同时在不同的图表上运行并报单,本图表的OnChartEvent也会接收到其他图表上的EA产生的报单回调,在第40行已经生成并记录了EA报单编号在eaOrderRef变量中,所以只有报单回调中的EA报单编号等于eaOrderRef变量才是本EA的报单回调(作用类似于外汇EA中的魔术号码)。

获得报单回调中的CTP报单编号、报单做多或做空、报单开仓或平仓、报单的价格、报单的手数,报单的成交手数,报单时间,报单的撤单时间和交易所对这次报单的撮合结果。

void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
{if(id==3000)     //只处理MT5 CTP的事件 process MT5 CTP event only{      string chartEvents[];     int n=StringSplit(sparam,splitCommma,chartEvents);   //CTP成交回调中的各个数据用逗号分隔  callback string split by commaif(n>0){string eventType=chartEvents[0];   if(eventType=="OnRtnOrder")    //CTP报单回调 send order callback{printf(sparam);//string symbol=chartEvents[2]; string orderRef=chartEvents[3];              //EA报单编号(魔术号码)  ea magic numberif(orderRef==(string)eaOrderRef)             //是本EA的报单 is my ea order{              string orderSysId=chartEvents[4];   //CTP服务器报单编号  CTP order Id                       string buySellEnum=chartEvents[5];  //多空  buy sellstring combOffsetFlag=chartEvents[6];    //开平  open close             string orderStatusEnum=chartEvents[7];    //报单状态枚举                                                                                  string statusMsg=chartEvents[8];    //报单状态信息double price=(double)chartEvents[9];   //报单价格                                        string priceWithDigital=DoubleToString(price, (int)digits);string vol=chartEvents[10];        //报单手数string fillVol=chartEvents[11];    //成交手数 string orderTime=chartEvents[12];    //报单时间                          string orderCancelTime=chartEvents[13];   //撤单时间}}

EA报单后交易所除了发送报单回调以外,如果成交了紧接着还会发送成交回调,然后mt5ctp.dll会把该报单回调作为图表事件发送给全部图表,EA 通过MQL图表事件响应函数OnChartEvent得到该报单的成交回调。

成交回调是一个字符串,格式如下:

OnRtnTrade, 交易所, 合约, EA报单编号, CTP报单编号, 成交编号, 多空, 开平, 成交价格, 成交手数, 成交时间,e

chartEvents数组的第4个元素是EA报单编号。如果有多个EA同时在不同的图表上运行并报单,本图表的OnChartEvent也会接收到其他图表上的EA报单后产生的成交回调,在第38行eaOrderRef变量已经记录了本次的报单编号,所以成交回调中的EA报单编号等于该变量才是本EA的成交回调(作用类似于外汇EA中的魔术号码)。

遍历chartEvents数组,取出成交回调中的交易所、合约、CTP报单编号、CTP成交编号、报单做多或是做空,报单开仓或者平仓,报单成交价格,报单成交手数,报单成交时间, 并计算EA仓位

 if(eventType=="OnRtnTrade")    //CTP成交回调 get filled event{printf(sparam);string orderRef=chartEvents[3];         //EA报单编号 magicif(orderRef==(string)eaOrderRef)        //如果CTP成交回调中的EA报单编号是本EA的报单编号就记录仓位 my EA order get filled{string exchange2=chartEvents[1];       //CTP成交回调中的交易所 exchangestring symbol2=chartEvents[2];       //CTP成交回调中的合约 instrument of callbackstring orderSysId=chartEvents[4];       //CTP成交回调中的CTP报单编号string fillId=chartEvents[5];       //CTP成交回调中的成交编号 filled Idstring buySellEnum=chartEvents[6];   //CTP成交回调中的多/空  buy/sell string openCloseEnum=chartEvents[7]; //CTP成交回调中的开平  0=开仓   1=平仓  2=强平  3=平今  4=平昨  5=强减  6=本地强平                double price=(double)chartEvents[8]; //成交价格  filled price               string buySell="";string vol=chartEvents[9];           //成交手数  filled quantityif(buySellEnum=="0")                 //0=多   1=空            {pos+=(int)vol;}else                                       {pos-=(int)vol;}               string tradeTime=chartEvents[10];     //成交时间  filled datetime}}  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/44615.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ETF大小盘轮动策略回测分析

从前面的ETF基金定投策略回测和周内效应分析文章中可以看到&#xff0c;代表大盘指数的沪深300ETF基金510300和代表小盘的创业板ETF基金159915的收益在长期来看差别较大。但是单独定投小盘指数收益高&#xff0c;但是回撤比较大&#xff1b;单独定投大盘指数回撤也不小&#xf…

量化基金 获取基金持仓情况;获取优秀基金人气组合持仓基金情况

通过点击显示全部ajax接口加载获取数据 import requests import re from lxml import etree import csvdef get_stock_lists(id):url2 f"https://fundf10.eastmoney.com/FundArchivesDatas.aspx?typejjcc&code{id}&topline10&year2021&month3&rt0…

TensoRT量化第四课:PTQ与QAT

目录 PTQ与QAT注意事项一、2023/5/8更新二、2023/5/12更新前言1. TensorRT量化2. PTQ3. QAT4. QAT实战4.1 环境配置4.2 pytorch_quantization简单示例4.3 自动插入QDQ节点4.4 手动插入QDQ节点4.5 自定义层量化4.6 官方案例 总结 PTQ与QAT 注意事项 一、2023/5/8更新 新增手动…

Vicuna-13B量化模型单GPU可跑

链接在这&#xff08;需要科学上网&#xff09; Vicuna-13B: Best Free ChatGPT Alternative According to GPT-4 &#x1f92f; | Tutorial (GPU) 有人在B站转了人家的视频 ChatGPT&#xff1a;在你的本地电脑上运行Vicuna-13B &#x1f92f;|教程 (GPU) 下面就是部署的步骤…

“Hey Siri” 背后的黑科技大揭秘!

作者 | Vishant Batta 译者 | 苏本如&#xff0c;责编 | 伍杏玲 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 以下是译文&#xff1a; 如今苹果手机可随时检测并回答“Hey Siri”命令&#xff0c;有人可能会想&#xff0c;它是不是在随时记录我们的日常生活对…

ChatGLM-RM(Reward Model)实现代码逐行讲解

这里我们尝试通过RM训练让模型学会从给定上下文中提取信息&#xff0c;来进行RM模型的实践。你可以从下面链接获取代码 GitHub - Pillars-Creation/ChatGLM-RLHF-LoRA-RM: ChatGLM-6B添加了RLHF的实现&#xff0c;以及部分核心代码的逐行讲解 ,实例部分是做了个新闻短标题的生成…

wochao!chatgpt 真的可以提高我的工作效率!

正确使用指南&#xff1a; https://www.explainthis.io/zh-hant/chatgpt/guidehttps://github.com/PlexPt/awesome-chatgpt-prompts-zh/

小马识途谈如何借助chatGPT提升工作效率

ChatGPT这么聪明会不会大家都要失业了&#xff1f;不用担心&#xff01;ChatGPT不是跟人来抢饭碗的&#xff0c;是来帮助人提升工作效率的&#xff0c;当然也可以是一个很好的学习工具&#xff0c;小马识途营销顾问认为网络营销从业者可以利用它快速提升自己的能力。 1. 学习新…

优思学院|质量人如何利用ChatGPT提升工作效率?

在许多人知道怎么用ChatGPT之后&#xff0c;不少人开始思考如何利用这个工具来提升自己的工作效率。 质量人也不例外&#xff0c;在质量管理中&#xff0c;有许多重复的任务需要人手去完成。这些任务可能包括检查文档、审查流程、跟踪错误等。这些任务既耗费时间&#xff0c;又…

比起“一键脱衣”,这种 AI 技术更可怕

随着科技的发展&#xff0c;现在出现了许多高科技产品&#xff0c;比如 AI、ChatGPT 等等。 可以说 AI 颠覆了我们的认知&#xff0c;因为许多事情我们都可以交给人工智能去做&#xff0c;比如写程序、写论文、写PPT、绘图等等&#xff5e; 目前我们打开一些软件后&#xff0c;…

如约而来 | 成功举办T00Ls论坛 “ 群英荟萃论技,共赴振兴网安 ”

沙龙概要 6月10日&#xff0c;在苏州希尔顿酒店T00ls论坛线下技术沙龙苏州站如期举办 。近年来&#xff0c;网络安全问题日益引起人们的关注&#xff0c;全球网络安全形势不断变化。为此&#xff0c;土司论坛联合百达智慧举办了一场以“低调求发展&#xff0c;潜心习安全”为主…

GPT神奇应用:辅助背单词

正文共 993 字&#xff0c;阅读大约需要 3 分钟 外语学习者必备技巧&#xff0c;您将在3分钟后获得以下超能力&#xff1a; 辅助背单词 Beezy评级 &#xff1a;B级 *经过简单的寻找&#xff0c; 大部分人能立刻掌握。主要节省时间。 推荐人 | nanako 编辑者 | Linda ●此图片…

Facebook如何安全度过新账号阶段不被封号

Facebook如何安全度过新账号阶段不被封号 今天来说下Facebook如何安全度过新账号阶段不被封号&#xff0c;这个应该是好多朋友都非常关心的问题&#xff0c;因为只有账号不被封后面才能有更多操作&#xff0c;加小组也好&#xff0c;创建主页管理主页也好&#xff0c;推广也好&…

ChatGTP--事务是否生效?

项目场景&#xff1a; 由于最近在做一个项目的cola代码改造,所以由于cola需要在 service 和 dao层中间加一层>>> gateway,和springcloud中的gateway不一样,这个仅仅是抽象了一层; 思考: 现在我的事务 依然在service中开启,那么我的事务经过了一个gateway后,再次调用d…

注册Tinder账号攻略 -- 解决账号被禁

Tinder是世界上最受欢迎的交友APP。每天&#xff0c;在Tinder上注册的左右滑动次数超过16亿次&#xff0c;匹配次数超过3000万次。Tinder的用户量每天都在不断的扩大&#xff0c;流量也自然更大&#xff0c;所以Tinder也成为了很多跨境电商朋友们推广的方式之一。 不过众所周知…

面向知乎的个性化推荐模型研究论文

面向知乎的个性化推荐模型研究 《面向知乎的个性化推荐模型研究》论文是大二暑假完成的&#xff0c;已投到《计算机应用与软件》中文核心期刊。论文主要对知乎提出一种基于混合算法的个性化推荐模型。论文基于用户模型、问题模型、推荐模型构建推荐系统&#xff0c;提出Person…

推荐只需要精确?顶会论文看多样化推荐研究趋势

©作者 | 林子涵 来源 | RUC AI Box 本文主要基于最近 2 年发表在顶级会议&#xff08;KDD、SIGIR、WWW、CIKM、IJCAI等&#xff09;的多样化推荐相关论文&#xff0c;介绍最新的研究工作&#xff0c;梳理其背后的技术脉络&#xff0c;同时在最后总结多样化推荐中潜在的研究…

【论文阅读】社交网络传播最大化问题-02

Leader-Based Community Detection Algorithmin Attributed Networks 以往leader-aware算法创新点问题定义定义基础概念定义创新概念 模型构造第一步&#xff1a;确定每个节点的leader第二步&#xff1a;合并小分支以得到最终结果 实验数据集人工合成网络现实世界的网络 基线方…

https://zhuanlan.zhihu.com/p/20397902

首发于 前端外刊评论 关注专栏 登录 写文章 Webpack傻瓜指南&#xff08;二&#xff09;开发和部署技巧 张轩 9 个月前 注意啦&#xff1a;如果你还没有看第一篇 请先看下第一篇的基础知识&#xff1a;Webpack傻瓜式指南&#xff08;一&#xff09; - 前端外刊评论 - 知乎专栏…

继续!从顶会论文看对比学习的应用!

公众号作者上杉翔二 悠闲会 信息检索 整理 | NewBeeNLP 上周&#xff0c;我们分享了对比学习的一些应用&#xff0c;从顶会论文看对比学习的应用&#xff01; 本篇博文将继续整理一些对比学习的应用&#xff0c;主要是集中在MoCo和SimCLR等模型。 1、LCGNN MoCo架构…