热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MQL4课程交易函数下单及挂单

第五节交易函数下单及挂单交易函数也算是MT4平台的独特函数了,也是最关键的一类,我们写程序最终还是要落到交易上的,那么下单和挂单的函数就

 


第五节 交易函数下单及挂单

交易函数也算是MT4平台的独特函数了,也是最关键的一类,我们写程序最终还是要落到交易上的,那么下单和挂单的函数就必不可少。


1下单

打开帮助文件,我们可以看到交易函数还是有蛮多的,这节课我们先不讲这么多,我们完成一个目标就可以了,那就是做好开单和挂单。

开单和挂单我们都采用OrderSend()函数来执行,首先我们试一下在当前品种开一个市价多单,代码如下:

void OnStart(){double lot=0.01;int huadian=10;int ticket= OrderSend (Symbol(),OP_BUY,lot,
MarketInfo(Symbol(),MODE_ASK),huadian,0,0,"MQL4 Lesson",1000,
0, clrAliceBlue);}

可以看到OrderSend()函数是个比较复杂的参数,它有十一个参数,给大家讲解一下这些参数都是什么意思。

第一个参数,是品种的名称;

第二个参数是开单的方式,如果是市价单,那么用OP_BUY或者OP_SELL,如果是突破单则用OP_BUYSTOP或是OP_SELLSTOP,如果是限价单则用OP_BUYLIMIT或者OP_SELLLIMIT;

第三个参数是开仓的手数;

第四个参数是开仓的价位,如果开市价多单,那么开仓价为买入价就可以了;第五个参数是滑点,如果滑点超过了这个数值,那么订单是不会成交的;

第六、第七个参数分别是止损、止盈价位,如果是0则表示不设置止损止盈;

第八个参数是订单的注释,可以备注开单的原因等等;

第九个参数是魔术号码,这个号码非常重要,一般来说EA是通过这个号码来识别它开的订单的,所以一定注意不同的EA一定要用不同的魔术号码来管理,否则会造成管理的混乱而产生亏损;

第十个参数是持续的时间,一般不怎么用,所以设置0就可以了;

最后一个参数是颜色,这个指的是开单后在图标上显示开单位置的那个箭头的颜色。

我们运行一下脚本,如下图,可以看到我们成功地开出了一个0.01手欧美的多单,备注是"MQL4 Lesson",没什么毛病。


2分批下单

在我们做下单的程序时,我们肯定也会想到一些问题,比如说单子手数很小,小于平台的最小手数限制,或者反之单子大于了平台最大单子的限制怎么办?

对于手数很小的单子我们没有办法,只能给一个输出提示一下,毕竟如果强行用最小手数的话有可能会出问题,因为有些品种的最小手数是1手,盈亏会很大,所以不建议当手数小于最小手数时采用最小手数下单。

那么当手数大于最大手数时,我们就得把这个单子拆成几个单子来下了,其实也不难,采用for循环就可以轻松做到,下面是一个例子:

void OnStart(){string sym= Symbol();int huadian=10;double lot=0.001;double maxlot= MarketInfo(Symbol(),MODE_MAXLOT);double minlot= MarketInfo(Symbol(),MODE_MINLOT);double amount=0;double lot_last=0;int i;int ticket=0;if (lotmaxlot){amount= MathCeil(lot/maxlot);lot_last=lot-(amount-1)*maxlot;for(i=(int)amount;i>0;i--){if (i!=1){
ticket= OrderSend (sym,OP_BUY, maxlot,
MarketInfo(Symbol(),MODE_ASK),huadian, 0,0,
"MQL4 Lesson",1000,0, clrAliceBlue);}else{
ticket= OrderSend (sym,OP_BUY, lot_last,
MarketInfo(Symbol(),MODE_ASK),huadian, 0,0,
"MQL4 Lesson",1000,0, clrAliceBlue);}
}}else{ticket= OrderSend (Symbol(),OP_BUY,lot,
MarketInfo(Symbol(),MODE_ASK),huadian, 0, 0,
"MQL4 Lesson",1000,0, clrAliceBlue);}}

上例中,我们把这个品种的最大手数赋给了maxlot,把最小手数赋给了minlot,如果开单的手数在maxlot和minlot之间,那么我就直接开单。

如果开单的手数比minlot小,那么我们就输出“手数太小”,不开单。

如果开单的手数比maxlot还要大,那么我们就求出这个大订单需要拆解成多少个小订单,并把订单数量存放在amount这个变量中,上例中的MathCeil()函数是向上取整的意思。然后我们计算出如果按最大手数来开单,最后一单应该是多少手,比如说我要开70手而最大订单数是50手,那么我应该开50手+20手,最后一单的手数是20手。这些都做好后用for循环开单就行了。

我们开一个0.001手试一下,运行结果如下:

可以看到程序输出了“手数太小”。接下来我们调整手数,将lot调整为0.01,可以看到我们开出了0.01手的订单。

最后我们试一下开1200手订单:

可以看到程序自动将1200手订单拆成了2个500手的单子和1个200手的单子,运行结果没有问题。

在以后的模块编写中,这一部分内容将非常重要。


3挂单

挂单其实和下单区别不是太大,不同之处在于单子成交的价格和挂单的类别。比如说我现在想在欧元美元1h级别的上一根K线最高价以上10个点挂一个0.1手的多单,代码如下:

void OnStart(){double lot=0.1;int huadian=10;double Price= iHigh("EURUSD",60, 1)+ 10 *(MarketInfo("EURUSD", MODE_POINT)* 10);int ticket= OrderSend ("EURUSD",OP_BUYSTOP,lot, Price,huadian, 0, 0,"MQL4 Lesson",1000,0, clrAliceBlue);}

可以看到和开单的例子相比,挂单仅仅多了一个挂单的价格Price,然后把OP_BUY改成了OP_BUYSTOP,其他都没变,所以学会了开单那么挂单也是一样的。

运行以上代码,我们顺利完成了挂单的任务。


4新闻交易双向挂单脚本

有了以上的挂单的基础,我们就可以搞一点点黑科技出来了,比如说写一个在重大消息公布之前一键双向挂单的脚本,这个脚本要能够实现快速地挂单,并设置好止损止盈。

如果这个任务交给一个人去完成,那是非常困难的事情,考验手速,没玩过几年星际争霸都搞不出来,而且在数据公布前有的时候会比较紧张,一紧张就容易挂错。这项黑科技便可以替我们完成这一系列复杂的操作。

我们在市价以上5个点挂一个0.1手突破多单,止盈为20个点,止损为5个点,然后在市价以下5个点挂一个0.1手突破空单,同样止盈20个点,止损5个点。代码如下:

void OnStart(){
double lot=0.1;
int huadian=10;
int tp=20;
int sl=5;
double Price_BUY= MarketInfo(Symbol(), MODE_ASK)+
5 *(MarketInfo(Symbol(), MODE_POINT)* 10);
double tp_BUY= Price_BUY+tp*(MarketInfo(Symbol(),
MODE_POINT)* 10);
double sl_BUY= Price_BUY-sl*(MarketInfo(Symbol(),
MODE_POINT)* 10);
int ticket= OrderSend (Symbol(),OP_BUYSTOP,lot, Price_BUY,huadian, sl_BUY, tp_BUY,"MQL4 Lesson",1000,0, clrAliceBlue);double Price_SELL= MarketInfo(Symbol(), MODE_BID)-
5 *(MarketInfo(Symbol(), MODE_POINT)* 10);
double tp_SELL= Price_SELL-tp*(MarketInfo(Symbol(),
MODE_POINT)* 10);
double sl_SELL= Price_SELL+sl*(MarketInfo(Symbol(),
MODE_POINT)* 10);
ticket= OrderSend (Symbol(),OP_SELLSTOP,lot, Price_SELL,huadian, sl_SELL, tp_SELL,"MQL4 Lesson",1000,0, clrAliceBlue);}

以上程序我们将多单和空单挂单的价格分别赋给了Price_BUY和Price_SELL,将多单的止盈止损分别赋给tp_BUY和sl_BUY,然后挂出多单,将空单的止盈止损分别赋给tp_SELL和sl_SELL并挂出空单,从而实现了双向挂单的功能。

我们双击一下脚本,程序自动挂了两个单,执行正常。

当然,要做一款用于新闻交易的EA肯定不止是这么简单的,比如说后面我们还要实现移动止损的功能,还有删除挂单的功能以及根据时间自动开仓的功能等,需要学习的东西还非常多,但是到这一步也算是比手工做单来的方便点了。

更多内容请关注公众号【火象】~


推荐阅读
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • C++ STL复习(13)容器适配器
    STL提供了3种容器适配器,分别为stack栈适配器、queue队列适配器以及priority_queue优先权队列适配器。不同场景下,由于不同的序列式 ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Python中的PyInputPlus模块原文:https ... [详细]
  • 五、RabbitMQ Java Client基本使用详解
    JavaClient的5.x版本系列需要JDK8,用于编译和运行。在Android上,仅支持Android7.0或更高版本。4.x版本系列支持7.0之前 ... [详细]
  • 1、概述首先和大家一起回顾一下Java消息服务,在我之前的博客《Java消息队列-JMS概述》中,我为大家分析了:然后在另一篇博客《Java消息队列-ActiveMq实战》中 ... [详细]
  • GO语言 包 if..else.. for循环 switch 数组
    包1.什么是包1.新建一个文件夹,内部写很多go文件,但是包名必须一致,改文件夹就是一个包2.作用和优点包用于组织Go源代码,提供了更好的可重用性与可读性。由于包提供了代码的封装, ... [详细]
  • 设计完成后,将所完成的作品交由老师检查。管理进程接收申请进入的信号,在消息队列中取下申请进入队列的用户进程的信息,针对当前临界区状态,写一个回馈信息 ... [详细]
  • RabbitMQ的消息持久化处理
    1、RabbitMQ的消息持久化处理,消息的可靠性是RabbitMQ的一大特色,那么RabbitMQ是如何保证消息可靠性的呢——消息持久化。2、auto ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 本文介绍了贝叶斯垃圾邮件分类的机器学习代码,代码来源于https://www.cnblogs.com/huangyc/p/10327209.html,并对代码进行了简介。朴素贝叶斯分类器训练函数包括求p(Ci)和基于词汇表的p(w|Ci)。 ... [详细]
  • 本文讨论了在使用Git进行版本控制时,如何提供类似CVS中自动增加版本号的功能。作者介绍了Git中的其他版本表示方式,如git describe命令,并提供了使用这些表示方式来确定文件更新情况的示例。此外,文章还介绍了启用$Id:$功能的方法,并讨论了一些开发者在使用Git时的需求和使用场景。 ... [详细]
author-avatar
hanhff
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有