
结语:MQL4编程学习之路,终点亦是新起点
作者:学长 如果你一直在看我的MQL4编程教学系列,从第一篇教学坚持到现在,请接受我最诚挚的祝贺!你已经完成了一段了不起的旅程。 现在的你不再是那个对代码望而生畏的门外汉,而是已经初步掌握了将交易理念转化为自动化程序的能力。这段旅程或许充满...
作者:学长 如果你一直在看我的MQL4编程教学系列,从第一篇教学坚持到现在,请接受我最诚挚的祝贺!你已经完成了一段了不起的旅程。 现在的你不再是那个对代码望而生畏的门外汉,而是已经初步掌握了将交易理念转化为自动化程序的能力。这段旅程或许充满...
近些年,外汇市场无疑成为了最吸引普通投资者的领域之一。全天24小时交易、灵活的杠杆、较低的入场门槛,这些特性给了我们普通人一个进入国际金融市场的机会。 而谈到外汇交易,几乎所有人都绕不开MetaTrader4(也就是我们常说的MT4)。它之...
大家好! 聊到外汇交易,很多人肯定都动过跑EA的心思。这玩意儿听起来太美了:一个能7×24小时不休息、帮你自动赚钱的机器人,还能克服你“管不住手”的毛病,简直就是通往躺赚人生的快车道啊! 但现实是,这片海里到处都是坑。很多所谓的神...
在EA策略中,很少有哪个名字像“马丁格尔”一样,同时被无数人追捧,又被无数人唾弃。它如同一位迷人的“恶魔”,向交易员许下一个看似永远不会输的诺言,但其背后,却隐藏着通往毁灭的深渊。 今天,我们不只学习马丁策略是什么,更要亲手解剖它,看清它致...
每一位程序员,无论新手还是专家,其大部分时间都不是在写新代码,而是在调试。这并非失败的标志,恰恰是编程这门手艺的精髓。调试,就是侦探工作:我们根据线索,建立假设,最终找到并修复系统中的罪犯(Bug)。 在MQL4中,我们缺少花哨的现代调试工...
这是系列教学的最后一篇文章,不知大家学会了多少,想进一步交流的加学长的微信:u31u31。 下面是课程中的自定义指标源代码: #property copyright "版权归“图道交易”学长所有" #property indicator_c...
下面展示的是一个MQL4包含文件(以 .mqh 为扩展名),其中包含了EA交易程序中所使用的各类自定义函数。 #property copyright "tudaojiaoyi" // 版权声明 #include <stdlib.mqh...
本节展示的EA交易程序同样基于函数化设计,但采用的是挂单方式进行交易。 功能上新增动态手数计算、追踪止损、每K线执行一次控制等功能等。 // ===== 预处理指令 ===== #property copyright "Andrew You...
本节展示的EA交易程序是基于之前介绍的函数化编程理念构建的。在此基础上,我们进一步集成了“一键平掉所有订单”功能和追踪止损机制,以及“每根K线仅执行一次交易逻辑”的特性。 EA核心交易所依赖的各类函数均在名为 IncludeExample....
本节展示的是一款采用挂单(止损单)方式进行交易,并融合了更多高级特性的EA程序代码。 相比于上一版,从市价单策略改为挂单策略,增加了更完善的市场状态检查、更严格的订单验证、改进了价格计算逻辑、增加了保证金检查、错误处理更加完善、订单管理更加...
本节展示的EA源码相比于上一版,增加了更多高级功能:手数计算的改进、错误处理机制、交易环境繁忙检测、止损止盈的改进、订单管理的改进(分两步开单,先开仓再设置止损止盈,然后验证并调整止损止盈价格,确保符合经纪商要求)、手数规范化处理。 这些改...
本节展示的是一款采用挂单(止损单)方式进行交易的基础版EA。 和第55篇里的基础版源码的区别:使用挂单来开仓。 MQL4(55):基础版EA交易程序源码 #property copyright "tudaojiaoyi" // ===== ...
MQL4系列教学结束了。 从这篇文章开始,我们温习下整个系列教学里EA开发的过程。从最简单的基础版EA源码到进阶版,来感受一下我是如何给一个EA添砖加瓦、完善其功能的。这款EA是否盈利不重要,它的作用是来给大家演示一个EA的成型过程。 #p...
若一本关于MQL语言的书籍,未能涵盖自定义指标与脚本的开发,那它无疑是不完整的。MetaTrader平台内置的指标虽多,但远非全部。幸运的是,MQL语言赋予了我们创造专属分析工具的强大能力。今天,我们将学习如何为我们的交易系统,打造独一无二...
在交易过程中,有时需要查询某个持仓订单的当前浮动盈亏,或者一个已平仓订单的最终盈亏。通常有两种方式来获取这些盈利信息。若要得到以账户存款货币(例如美元)计价的盈利,可以使用 OrderProfit() 函数。但在此之前,必须先通过 Orde...
我们已经掌握了EA这栋“房子”内部的两种变量:放在独立房间的“私人物品”(局部变量),和放在大厅的“公共家具”(程序内全局变量)。但现在思考一个问题:如果整栋房子突然断电(MT4重启或崩溃),会发生什么? 答案是:房子里的一切“记忆”都会丢...
在某些交易策略中,您可能需要针对同一个入场信号(或持仓)下达多个订单,这些订单可以拥有各自不同的止损、止盈水平以及手数大小。实现这一需求有多种途径,最直接的一种方法是,发出的每一笔订单都单独编写一条 OrderSend() 指令。这种方式的...
一个成功的交易策略,不仅仅在于何时入场,更在于何时不该入场。专业的交易员会主动规避那些高风险、低胜率的“垃圾时间”。今天我们就来为我们的EA安装上两套至关重要的“风险过滤器”,教会它这项宝贵的交易纪律。 我们将在下单前的最后一步,执行这套“...
在此前的课程中,我们一直使用“魔术号”作为EA的唯一标识,来区分EA自己下的订单和手动订单。但如果你的EA变得更复杂,需要在同一个图表上,同时运行多个不同的、独立的子策略,那该怎么办? 比如,你的EA中既有一个长线的趋势跟踪策略,又有一个短...
我们始终强调在尝试发出交易指令前,预先检验订单的各项参数。这样做是为了尽可能避免因参数设置错误或价格不当而引发的常见错误提示。然而,即便如此,实际交易中仍可能遭遇重新报价、交易环境繁忙或服务器通讯故障等问题。这些问题并非总能完全规避,但当它...
EA可以配置为在发生特定事件时(例如,成功下单、出现交易信号、达到止损/止盈等)通过电子邮件向您发送通知。这可以通过 MQL4内置的 SendMail() 函数来实现。 1. 配置 MetaTrader 的邮件发送功能: 在使用 SendM...
在之前的示例中,我们主要使用 Alert() 函数来向用户显示简单的提示或错误信息。但如果您希望创建更具交互性、外观更丰富的自定义对话框(例如,包含不同的按钮选项、图标等),或者需要获取用户的明确输入(如“是/否”选择),那么 Messag...
当你投入了大量心血,终于开发出一款能稳定盈利的EA时,你可能会考虑将它商业化,或者至少,希望能安全地分享给朋友测试。这时,我们就必须为EA加上一把“锁”,以确保它不会被随意复制和滥用。 今天,我们就来学习如何为我们的EA打造一套简单而有效的...
想象一下,你精心聘请了一位顶级的交易员(你的EA)来管理账户。你把他带到了交易大厅,却忘记给他办理进入交易室的“门禁卡”。他空有一身本领,却什么也做不了。 在MetaTrader平台中,“允许实时交易”、“允许导入DLL”这些选项,就是我们...
从本章开始,我们将学习一些在开发EA时可能会非常实用的一些附加功能和技巧。 转义字符 在MQL4的字符串常量(即用双引号括起来的文本)中,如果您希望包含某些特殊字符,如双引号本身、单引号或反斜杠符号,您需要在这些特殊字符前加上一个反斜杠 (...
如何让你的炒外汇的EA不那么“激动”,不是一有风吹草动(每个微小的价格变动)就去分析和做决定,而是更有“耐心”,只在每根新的K线蜡烛图(比如每小时一根、每4小时一根或每天一根)刚开始的时候才去思考和行动一次。 想象一下: 默认情况(每个ti...
日期时间变量实际上是基于从1970年1月1日开始计算的秒数。比如,2009年6月15日凌晨0点会被记录为1245024000。这种日期时间格式的好处是,它使过去和将来时间的比较及数学运算变得相当简便。 例如,若想判断一个日期是在另一个日期之...
在构建交易策略时,我们往往不仅需要知道指标当前的值,还需要了解它相较于过去是如何变化的。例如,判断移动平均线 (MA) 是正在上升还是下降,或者一个震荡指标(如随机指标)是否刚刚穿越了某个关键水平(如超买/超卖线)。这都需要比较当前或最近完...
在 MQL4编程中,我们使用条件运算符 if 和 else 来构建和评估交易系统的入场、出场及其他管理逻辑。您在本书的前面部分可能已经见过它们的应用,但为了照顾初学编程的读者,这里我们快速回顾一下它们的基本用法。 1. if 运算符 if ...
在 MQL4编程中,调用技术指标函数(如 iMA(), iStochastic(), iCustom() 等)以及某些价格数据函数时,经常需要传入一些特定类型的参数,例如时间周期、应用价格类型、移动平均线的计算方式等。MQL 为这些常用的参...
网络上有成百上千可用于 MetaTrader 平台的自定义指标。如果您决定在您的EA中使用这类非平台内置的自定义指标,那么就需要进行一些额外的工作。 获取源代码的重要性:在使用自定义指标时,如果能拥有其 .mq4 源代码文件无疑是最佳情况。...
技术指标 绝大多数交易系统都会利用各种技术指标来辅助判断市场状况和产生交易信号,MetaTrader 平台内置了超过 20 种常见的技术指标,例如: 移动平均线 (MA) 平滑异同移动平均线 (MACD) 相对强弱指数 (RSI) 随机震荡...
在过去的几章中,我们致力于创建一系列用于执行订单处理机制的函数。这些函数是几乎所有EA都通用的基础模块,设计它们的初衷是希望它们能在各种交易场景中被复用,并尽可能保持灵活性。这样做的目的是让我们能够从繁琐的订单操作细节中解放出来,从而更专注...
现在我们来修改均线交叉EA的 OnTick() 函数,以便应用我们新创建的那些功能。首先,在建立新的买单前,我们会检查当前是否已经有买单持仓。我们不再是去平掉单个卖单,而是直接调用一个函数来平掉所有卖单。这种方法不需要用到订单号。 // 买...
盈亏平衡止损 除了追踪止损外,另一种常用的订单风险管理技术是盈亏平衡止损 。它的核心逻辑相对简单:当一笔订单的浮动盈利达到或超过预先设定的一个最小盈利点数后,就自动将该订单的止损位移动到其开仓价格。 这样做的目的是,一旦交易向有利方向发展并...
追踪止损的实现 追踪止损是一种动态调整止损位的风险管理技术。其核心思想是:当订单产生浮动盈利时,自动将止损位朝着盈利方向移动,以“锁定”已获得的利润,并在价格反向回调时保护这些利润。 工作原理: 设置距离: 首先设定一个追踪距离,通常以pi...
在开发 EA 时,经常需要知道当前由本EA管理的、符合特定条件的订单数量。例如,统计总共有多少订单、有多少买单、多少卖单、多少挂单等。这对于执行某些策略逻辑(如限制最大持仓数、判断是否已有同向订单)或进行信息展示都非常有用。我们可以创建一系...
在前面已经接触过 OrderSelect() 函数。本节我们将探讨如何结合使用 OrderSelect() 函数与 MQL 中的循环运算符(for 循环和 while 循环),来实现对订单池(即当前所有持仓订单和挂单的集合)的遍历操作,以便...
整合所有功能 现在,我们将展示最终使用本章创建的各种辅助函数重构后的 MA 交叉 EA 的完整代码结构。我们假设所有这些函数(如手数计算、验证、开仓、平仓、SL/TP 计算、调整、添加 SL/TP 等)都定义在 IncludeExample...
使用包含文件 (.mqh) 来组织函数 随着我们创建的辅助函数越来越多(如 PipPoint, GetSlippage, CalcLotSize, VerifyLotSize, OpenBuyOrder, AddStopProfit 等),...
封装添加/修改止损止盈函数 (AddStopProfit) 为了进一步细化函数职责,我们将为现有订单添加或修改止损 (SL) 和止盈 (TP) 的操作也封装成一个独立的函数。这个函数尤其适用于配合那些为了兼容 ECN 而在下单时不设置 SL...
封装验证与调整函数 为了方便地处理前面讨论的停止级别验证问题,我们可以创建两类辅助函数: 验证函数 (Verification Functions): 这类函数只检查给定的价格(如 SL/TP 或挂单价)是否满足最小停止距离要求,并返回一个...
封装SL/TP价格计算函数 为了将 SL/TP 的计算逻辑与验证逻辑分离,并提高代码复用性,我们可以创建专门的函数来根据开仓价和用户指定的点数 (pips) 计算出目标的 SL 或 TP 价格。 函数设计要点: 输入: 函数接收交易品种 (...
封装平仓函数 最后,我们将订单平仓的逻辑也封装成一个可重用的函数。这个函数将专注于关闭单个指定的市价订单。当您需要精确地关闭某一个特定的订单时(例如,基于订单号)这时下面这个函数就很有用,同时加入了必要的检查和错误处理。 关闭指定买单 (C...
封装市价买单函数 (OpenBuyOrder()) 现在我们来创建一个用于开立市价买单的可重用函数。在设计这个函数时,我们与之前直接在 OnTick() 函数中编写的代码有所不同,主要出于以下考虑: 这个下单函数只负责发送开仓指令。它不包含...
在前面的章节中,我们逐步构建了包含下单、错误处理、价格验证、手数计算等功能的代码逻辑。现在,我们将学习如何将这些代码块封装成可重用的函数。这样做的好处是: 将复杂的细节(如手数计算、价格验证等)隐藏在函数内部,使得 OnTick() 等核心...
现在我们将把本章学习到的所有高级功能——包括订单修改、交易上下文检查、预定义变量刷新以及动态手数计算与验证等等整合到之前那个简单的移动平均线交叉 EA 中。 修订后 EA 的结构与代码片段: 文件头部与全局设定: #property cop...
MetaTrader平台为所有运行在上面的EA提供了一个单一的交易执行线程。这意味着,在同一时刻,只有一个EA能够成功地执行交易相关的操作(如下单、平仓、修改订单等),无论您在终端中同时运行了多少个 EA 实例。这种机制是为了保证订单处理的...
在构建交易策略时,除了精心设计入场、出场、止损和止盈规则外,确定每次交易使用多大的手数是风险管理中至关重要的一环。最简单直接的方法是设置一个固定的手数(例如,通过 extern 变量让用户输入),并在所有交易中都使用这个固定值。然而,这种方...
在计算出目标止损价和止盈价之后,我们必须验证它们是否满足经纪商的最小距离要求(即 MODE_STOPLEVEL 对应的价格距离)。需要注意的是,对市价单和挂单的止损验证,其考虑因素略有不同。 止盈验证规则: 买单止盈价必须 >= As...