认识交易函数、常量
从第三章开始将正式学习EA编程中最重要的一环,交易函数的正式运用。在MQL4中,交易函数是用于执行各种交易操作的必备。它们提供了一系列函数来实现下单、平仓、修改和删除订单等基本交易行为。通过调用这些函数,交易者可以根据自己的交易策略和市场分析,自动化地进行各种交易操作。
获取订单信息前准备
在获取订单信息之前,如果你要获得全部订信息,我们首先要回顾一下最基本的for循环,因为在订单信息获取的过程中,要借助循环遍历的方式遍历到账户中存在的订单数量才能开始。下图为一个简单的订单遍历和获取订单信息的流程。
for循环复习:
for 循环是常用的迭代结构,用于重复执行一段代码,直到满足特定的条件才停止。它们的详细结构如下:
- 初始值:在循环开始之前执行的语句,用于初始化循环控制变量
- 条件:每次循环迭代前进行判断的表达式,如果条件为真,继续执行循环体;如果条件为假,跳出循环。
- 更新操作:每次循环迭代后执行的语句,用于更新循环控制变量的值。
- 循环体:在条件为真时重复执行的代码块。
以下是一个示例,展示了如何使用 for 循环打印从 1 到 5 的数字:
在上述示例中,i 的初始值为 1,每次迭代后通过 i++ 更新 i 的值,循环条件为 i <= 5。在每次迭代中,打印当前 i 的值,然后继续下一次迭代,直到 i 大于 5 时循环结束。在懂得for循环后我们开始今天的正题。
认识订单信息函数
1、OrdersTotal()、OrdersHistoryTotal():订单总数函数,这两个函数是遍历订单时重要函数之一,OrdersTotal()用于获得在你的仓位中的市场单和挂单的总数量,既未平仓的所有订单;相反OrdersHistoryTotal()则是获取的账户中所有已经平仓的订单数量,在做历史订单统计时需要用到。
2、OrderSelect():订单选择函数,这个也是最重要的函数之一,只有在成功选择订单后才能使用其他订单信息函数获取对应的订单信息。该函数为布尔形态,接受三个重要参数,在成功选择订单后返回真;
- n, 第几个订单:
- SELECT_BY_POS/SELECT_BY_TICKET:从订单顺序或者订单号来选择订单
- MODE_TRADES / MODE_HISTORY:选择持仓订单还是历史订单
3、剩余的就是其余16个重要的订单信息函数,了解其功能即可。在这些函数中。你可以拿来判断过滤条件,也可以直接用来获取信息。
- OrderClosePrice() 返回当前选定订单的收盘价
OrderCloseTime() 返回当前选定订单的关闭时间
OrderComment() 返回当前所选订单的评论
OrderCommission() 返回当前所选订单的计算佣金
OrderExpiration() 返回所选挂单的到期日期
OrderLots() 返回所选订单的手数
OrderMagicNumber() 返回当前所选订单的标识号(魔术)
OrderOpenPrice() 返回当前选定订单的开盘价
OrderOpenTime() 返回当前选定订单的开盘时间
OrderProfit() 返回当前选定订单的利润
OrderStopLoss() 返回当前选定订单的止损值
OrderSwap() 返回当前选定订单的掉期价值
OrderSymbol() 返回当前所选订单的商品名称
OrderTakeProfit() 退货获利当前选定订单的价值
OrderTicket() 返回当前选定订单的票证编号
OrderType() 返回当前所选订单的订单操作类型
4、另外,对于OrderType() 函数,既订单类型,这里还需要明白我们常见的订单是怎么区分多空或者挂单的。在MT4中OrderType()函数接受的订单操作类型共分为7种,前6种如下图所示,代表值分别代表了每一种不同订单类型,为了容易记住,MQL4中也为每种值分配了固定的常量名称,不管你是直接使用值还是常量都是一样的。
两种等效的表达方式。
学习与实践
1、获取当前货币魔号为123456的多单手数总数和总利润。
逻辑解析:
- for(int i = 0; i < OrdersTotal(); i++)
这是一个 for 循环语句,用于遍历当前账户下的所有订单。OrdersTotal()函数返回账户中的持仓订单总数。循环变量 i 从 0 开始(也就是离当前最近开的一个单子),直到小于订单总数(最早的开的单子)为止;
要是把for的循序反过来,顺序也就从最早的开始。那么怎么理解OrdersTotal() – 1呢?上面我们提到0代表当前最近的一个订单,而OrdersTotal代表了订单总数,假如总数有10个订单,最早的一个就是9,由此10-1=9,OrdersTotal() – 1自然代表了最后一个订单。既i=最后一个订单,只要i大于等于0,就继续循环,也可以理解为循环到0的时候停止,也就遍历到了所有持仓订单,两种方法几乎是等效的;但在一些特殊场景下我们需要反过来,比如处理平仓单,这个我们后面到订单修改函数部分再解读。 - if(OrderSelect(t, SELECT_BY_POS, MODE_TRADES))
OrderSelect()函数用于选择指定的订单。 i 则是遍历到的订单顺序定位,这里使用SELECT_BY_POS模式,表示按照位置索引选择订单。MODE_TRADES表示选择交易订单,而不是挂单。
如果选择订单成功,则进入下一个代码块。 - if(OrderType() == 0 && OrderSymbol()Symbol() && OrderMagicNumber()”123456″)
OrderType()函数返回订单类型,这里判断是否为买入订单(0)。
OrderSymbol()函数获取订单的交易对,symbol代表当前加载EA的图表货币。
OrderMagicNumber()函数获取订单的Magic,这里判断是否为”123456″。 - 如果满足这些条件,则进入下一个代码块。
int buyOds++;
这行代码将 buyOds 变量的值加1,用于统计满足条件的买入订单数量,有多少个订单循环多少次就加多少次。
double Lots += OrderLots();//可以理解为Lots = Lots+OrderLots();
这行代码将当前订单的交易量累加到 Lots 变量中,用于统计所有满足条件订单的总交易量。其表达方式和
double Profit += OrderProfit();
这行代码将当前订单的盈亏累加到 Profit 变量中,用于统计所有满足条件订单的总盈亏。
欢迎观看本期教程,祝大家学习愉快!
请登录后查看评论内容