在上一期,我们认识了交易函数和常量当中的订单信息获取方式,这是在一个EA中非常重要的一部分,也是不可缺的一部分。那订单信息从何而来?比如止盈止损怎么修改?这就到了今天的学习内容,4个重要的函数:
- OrderSend();订单发送
- OrderModify();订单修改
- OrderDelete();挂单删除
- OrderClose();持仓单平仓
发送订单 OrderSend()
用于发送新的交易订单
语法/函数结构:
参数说明:
- symbol: 交易品种
- cmd: 交易指令,可以是以下6种当中的任何一种
- volume: 交易手数
- price: 开仓价格
- slippage: 最大允许的滑点
- stoploss: 止损价格
- takeprofit: 止盈价格
- comment: 订单备注
- magic: 订单魔术号
- expiration: 挂单有效期
- arrow_color: 订单箭头颜色
返回值:
大于0 表示下单成功,-小于0表示下单失败
实践:
在这个实例中,我们首先定义一个开仓的手数,使用NormalizeDouble函数对该值进行规范化处理到2位小数的手数值,另外是注释和魔术数。对于止损和止盈我们留空,如果你需要在开仓时就带上固定的止盈止损,可以设为你想要的止损值。止盈止损的计算方式在下一个函数中解读。
此时我们按照上面学到的函数结构,分别填入对应的参数(11个),这个订单发送逻辑就创建好了。
我们一起来看下效果!
Damn!!有没有注意到,这样会无限下单,显然是违背正常开单的,那怎么办呢?当然是根据你实际的使用,比如产生某个信号时,再使用 OrderSend()函数,也就是对下单的频率进行限制,不要任由该函数持续性的执行。
订单修改 - OrderModify()
用于修改已经存在的订单属性,对于挂单,包括止盈止损以及价格和挂单过期时间;对于市场订单,可以修改其止盈止损。必备条件必须有明确的订单号,比如我要修改某一个订单的止损,首先得通过遍历订单的方式找到该订单的单号,该函数才能执行具体操作。
语法:
参数说明:
- ticket: 要修改的订单号
- price: 修改后的开仓价格(市场单不能改)
- stoploss: 修改后的止损价格
- takeprofit: 修改后的止盈价格
- expiration: 修改后的挂单有效期
- arrow_color: 订单箭头颜色(可选)
返回值:
true - 修改成功,false - 修改失败。
止盈止损的基本逻辑图解:
下图为多单的止盈止损示意图。止盈顾名思义就是在顺着订单的反向设的值,等价格达到理想盈利价位后自动关闭订单;反之,止损则是在订单的后方设置一个不利于订单发展的价位,以预防造成更多的亏损。对于设置止盈止损的反向,多单和空单正好相反。
而规范化价格的函数NormalizeDouble(),最后通过以给定的止损点位计算,将得到一个标准化的止损/止盈价,因为单独用点位来设置盈损是行不通的。这里给大家普及一个概念如下:
- 原始盈损点:整数,相当于价格当中的大点价值1,比如1.00528的价格如果直接设置100点将变成101.00528,。
- 实际止盈价:浮点数,相当于价格的小点价值0.00001计算(根据品种而定),比如1.00528的价格如果设置100点将变成1.00628。
(以tp:300,sl:100计算的盈损示意图)
实践:
以下实例同样是无条件对当前货币的多单进行止盈止损的设置,设置前使用了几个判断条件过滤订单以满足要求,也就是只处理满足条件的订单,判断成立后自动执行。填入参数时,一定要反复确认参数对应位置是否和语法一致。
关闭订单 - OrderClose()
功能:用于平仓已经存在的订单
语法:
参数说明:
- ticket: 要平仓的订单号
- lots: 平仓数量
- price: 平仓价格
- slippage: 最大允许的滑点
- clr: 订单备注颜色(可选)
返回值:
0 - 平仓失败,false
1 - 平仓成功,true
实践:
对于持仓订单,在没有设置止盈止损、或者在满足其他条件的情况下,我们可以使用该函数来进行平仓操作。另外在上一期文章中,我们提到了的反向循环:在平仓的时候,如果使用正向循环遍历,此时假如有正在开仓的订单出现,那么可能导致平仓不彻底,因为循环开始的时候是从当第一个订单开始(排序0),如果有新订单进入,循环还是会继续,但新订单再次把顺序【0】刷新为自己,这就会导致最后一个订单被忽略掉,为了避免这种情况发生,我们使用反向循环遍历处理平仓。
实例中,我们定义一个时间点作为平仓条件,达到这个时间,如果一系列条件都吻合,那么就执行平仓,如果平仓失败会打印错误信息。
删除挂单 - OrderDelete()
功能:用于删除已经存在的挂单
语法:
参数说明:
- ticket: 要删除的订单号
- clr: 订单删除备注颜色(可选)
返回值:
- true - 删除成功
- false - 删除失败
实践:
对于删除挂单的函数,参数很简单,用法和平仓相似,只需要遍历到订单号即可删除所有满足条件的挂单。在示例中,最后一个条件为if(OrderType()>1),也就是订单类型大于1,既为挂单。挂单类型大家可以反复查看文章口头中的订单类型介绍图。大于1的包括3456,自然也就包含了所有挂单类型。如果要对错误信息处理,可以参照平仓里的错误判断信息编写。
本章知识点:
- OrderSend();订单发送 - 无需循环遍历即可执行下单
- OrderModify();订单修改 - 需要循环遍历获取原始订单号
- OrderDelete();挂单删除 - 需要循环遍历获取原始订单号
- OrderClose();持仓单平仓 - 需要循环遍历获取原始订单号