MQL4编程入门:零基础掌握MT4指标与EA开发 简介这是一份面向外汇交易者和编程初学者的MQL4编程入门教程以MT4平台为依托讲解如何利用MQL4编写自定义指标、交易策略与EA智能交易系统从而将人工分析思路转化为可自动执行的程序。内容从最基本的自定义变量讲起逐层覆盖整形、双精度、字符串、逻辑型等变量类型并介绍extern附加变量在策略参数调整中的用法随后讲解自定义函数的定义、参数传递与返回值机制以及数组的建立、赋值和引用方法。资料共1个doc文档压缩包约197KB结构紧凑、循序渐进适合完全没有编程经验的交易者作为第一份入门教材。已有389人学习浏览。通过学习这些基础知识读者可理解MQL4程序的基本骨架并动手编写简单指标、信号判断或EA雏形为后续独立开发个人交易工具打下基础。1. 先搞懂它是什么MQL4 编程入门究竟在“入”什么门刚接触外汇交易那会儿盯盘盯到眼花是很正常的。那时候我总在想每天看着MT4里一堆货币对的K线图手动去比对均线、MACD、RSI能不能把其中一部分活儿交给程序后来答案落在了一个词上——MQL4。它是MT4自带的编程语言也是大多数人进入“MT4编程入门”这个领域要学的第一门语言。说白了MQL4 就是写给 MT4 听的一段“指令”。你告诉它价格突破某个位置就弹个窗、两条均线一上一下就算个差值、每隔十分钟把当前报价发一封邮件给你它就会照着做。你不需要成为软件工程师大部分时候你只需要五六个基础语法再加几个现成的“取值函数”就能写出挺实用的东西。这篇入门不跟你讲理论推导也不扔一堆术语而是按零基础最容易上手的路子来先把变量、函数、数组这些“积木”认全再学会读取行情数据、写判断和循环最后亲手做出一个能显示在图表上的指标。每一步都有代码、有解释、有新手最容易踩的坑。读完它不是让你变成大神而是让你不再发怵敢动手打开编辑器敲第一行字。2. 先认识三盒积木变量、函数与数组把地基铺平再上楼学习 MQL4 的第一步不是急着去写策略而是先认识三样最基础的东西变量、函数、数组。它们几乎是所有指标和 EA自动交易程序的通用零件。你把这三样弄明白了后面读代码会顺畅很多这三样含糊后面大概率会翻车。2.1 变量给程序一块能记住数字的地方变量就是一块“贴着名字标签的存储空间”。程序运行的时候需要临时记住很多东西比如当前的价格、上一次报警的时间、某个条件是否已经触发过这些都得用变量存起来。MQL4 里常用的基本变量类型有四种新手记住这张表就够了类型关键字名字能存什么例子int整型整数包括负整数int 数量 5;double双精度小数带小数位的数价格基本用它double 现价 1.23456;string字符串一串文字比如货币对名称string 品种 EURUSD;bool逻辑型真或假true / falsebool 是否报警 true;创建变量就是“定义变量”。定义的时候要同时说明类型和名字可以顺手赋一个初始值也可以不赋。比如int mark; // 定义一个整型变量名字叫 mark没赋初值 bool 是否报警 true; // 定义逻辑型变量名字叫“是否报警”初始值是 true注意一个新手特别容易迷糊的点类型关键字只在“定义变量”的时候出现一次。后面对这个变量赋值或者取值直接写名字就行不用再写 int、bool 这些。你要是再写一次int mark 3;那就不是在给 old 变量赋值而是在重新定义一个新变量很多编译错误就是这么来的。变量名用英文、数字、下划线都行而且 MQL4 旧版教程里还允许用中文字符做变量名比如上面那个“是否报警”。不过我从第一次学的时候就养成了一个习惯变量名尽量用英文含义用注释写清楚。因为中文变量名在一些老旧版本里容易乱码代码一多你自己都分不清谁是谁。除了普通变量还有一种很常用的叫“附加变量”定义的时候在类型前加一个extern关键字extern int 周期 9; // 附加变量默认值 9用户可以在外部修改附加变量的意思是程序投入使用后这个变量的值允许你在 MT4 的指标参数框里直接改不用去动代码。你平时用 MACD 指标时看到的 (12, 26, 9) 三个参数本质上就是三个附加变量。别人把参数写死进代码里你没法改用 extern 定义后每个使用者都能根据自己的喜好调整。2.2 函数把一段计算装进一个“参数进去、结果出来”的黑匣子如果说变量是积木函数就是把积木拼成的一个“小机器”你从一边塞进去几个数它从另一边吐出一个结果。初中数学里的f(x,y) 3x 2y就是一个函数MQL4 里的函数写法跟它非常像。比如我们要定义一个函数输入两个整数 x 和 y返回3x2y的计算结果int ft(int x, int y) { int temp; // 先在函数内部定义一个临时变量 temp 3 * x 2 * y; // 计算 3x 2y return(temp); // 把计算结果返回出去 }这个函数头部的int表示“返回值的类型是整数”ft是函数名括号里的int x, int y是参数列表大括号里的是函数体。return是结束语句后面括号里的值就是函数运算完吐出来的“结果”。调用它非常简单只要函数名对、参数个数一致、类型匹配就行int result ft(4, 5); // 把 4 传给 x把 5 传给 y这里 result 得到的就是3*4 2*5 22不对3*4 2*5 12 10 22。原文的例子是3*4 2*5 23这明显算错了。我讲课时会把数学改对避免误导所以这里应该返回 22。函数有几点要知道。第一函数类型就是返回值类型有 int、double、string、bool 这些还有一种函数只是执行动作不需要返回结果类型就写成void比如void 发邮件()干完活就结束没有返回值。第二函数里定义的变量是“局部变量”只在函数运行时存在函数执行完就自动注销了。上面的 temp、x、y 只在 ft() 内部有效出了函数就不认识它们。第三简写完全没问题刚才那个函数可以压缩成一行int ft(int x, int y) { return(3 * x 2 * y); }第一次学的时候别急着追求简短先用最啰嗦的写法把逻辑摆清楚跑通了再压缩。2.3 数组给同一类数据准备一排抽屉数组就是一系列同类型变量的集合可以同时存储多个数值。比如你有一排抽屉每个抽屉里放一个数值抽屉上标着号码。MQL4 里定义数组的写法int aa[4] {4, 3, 2, 1}; // 名字叫 aa 的整型数组长度 4里面存 4 个整数这里中括号里的 4 表示数组有 4 个元素大括号里是初始值。关键规则数组第一个元素的编号是 0不是 1。所以 aa[0] 的值是 4aa[1] 的值是 3aa[2] 的值是 2aa[3] 的值是 1。这个“从 0 开始数”的习惯跟生活不太一样新手经常搞混但它贯穿整个 MQL4 编程必须一开始就记住。定义数组时可以设定长度也可以不设定可以赋初值也可以不赋。几种常见写法int bb[]; // 创建空数组没设定元素个数 int cc[8]; // 创建数组 cc确定有 8 个元素不赋初值 int dd[3] {9, 8, 7}; // 创建数组 dd3 个元素依次赋值为 9、8、7 int ee[9] {0, 1, 2, 3}; // 创建数组 ee9 个元素只给前 4 个赋初值最后一种要注意数组定义了 9 个元素但大括号里只有 4 个值剩下的 5 个元素会自动补 0。这一点在算数据时很有用但也容易让你忘记“后面几位其实是 0”。数组使用时的赋值必须一个一个来不能整列一起改。比如dd[2] 1; // 把 dd 的第 3 个元素编号 2改成 1这条语句执行后dd 里的值从 {9, 8, 7} 变成 {9, 8, 1}。注意这里没有出现int因为 dd 早就定义过了我们只是在改它的某一个元素。那数组到底有什么用简单说当你需要成批处理数据的时候比如把 1000 根 K 线的收盘价都取出来算平均值用 1000 个独立变量会写到崩溃用数组加循环就干净利落。下一章你就会看到MT4 里所有 K 线数据本身就是用数组存的所以不懂数组就寸步难行。3. 让代码活起来读取行情、条件判断与循环写代码必会的三件套积木认识了接下来要让积木真正干点活。这章讲三件事怎么把行情数据取出来、怎么让程序根据条件做判断、怎么用循环处理海量数据。这三件事合起来你就能写出第一个真正意义上的指标或报警程序了。3.1 预定义数组Open[0]、Close[1] 这些 K 线数据从哪来MT4 早就帮你把行情数据准备好了直接就能用不需要你自己去定义。这些就是“预定义数组”。每个品种、每根 K 线都有自己的开盘价、最高价、最低价、收盘价和成交量因此 MT4 用数组来装它们开盘价数组Open[]最高价数组High[]最低价数组Low[]收盘价数组Close[]成交量数组Volume[]K 线时间数组Time[]这些数组的元素类型都是 doubleTime[] 是 datetime 类型。用的时候方括号里写的是“第几根 K 线”但顺序跟正常思维是反的最右边、最新的那根 K 线编号是 0往左数依次是 1、2、3……Open[0] // 最新一根K线的开盘价 Close[1] // 右边数第二根K线的收盘价 High[2] // 右边数第三根K线的最高价 Low[i] // 右边数第 i1 根K线的最低价这个“从右往左、从 0 开始”的规则是新手最容易栽跟头的地方。我第一次写代码时想取“最新一根K线的开盘价”想当然地写了Open[Bars-1]结果取到的是图表最左边最古老的一根K线整个指标画出来完全不对。记住要最新数据就找编号 0编号越大K 线越老。除了数组还有几个常用的预定义变量Ask // 当前买入价double 类型 Bid // 当前卖出价double 类型 Bars // 当前图表上的K线总数int 类型 Digits// 当前品种的小数位数比如无日元的货币对是 4有日元的是 2 Point // 当前品种一个点的价值无日元的是 0.0001有日元的是 0.01Digits和Point在格式化价格显示时特别有用。比如你想在报警弹窗里显示“当前价格 1.2345”不能把 double 直接塞进字符串里得先转成字符串再用 Digits 控制小数位数。3.2 指标函数iMA、iCustom 怎么把现成的指标值“取”出来用预定义数组能拿到 K 线的原始价格但如果你想要的是某个周期的均线值、MACD 里某条线的值怎么办MT4 提供了一批“指标取值函数”最常用的几个长这样iOpen(symbol, timeframe, shift) // 开盘价 iClose(symbol, timeframe, shift) // 收盘价 iHigh(symbol, timeframe, shift) // 最高价 iLow(symbol, timeframe, shift) // 最低价 iVolume(symbol, timeframe, shift) // 成交量 iTime(symbol, timeframe, shift) // 时间这三个参数分别表示货币对名、K线周期、位置序号。第一个参数如果不想写死可以直接写NULL意思是“当前图表是什么品种就用什么品种”第二个参数写0表示“当前图表是什么周期就用什么周期”。周期也可以用 MT4 定义好的常量比如 1 分钟图是PERIOD_M11 小时图是PERIOD_H14 小时图是PERIOD_H4日线是PERIOD_D1周线是PERIOD_W1月线是PERIOD_MN1。举个例子你想取美元兑日元 1 小时图最新一根K线的开盘价就写iOpen(USDJPY, PERIOD_H1, 0)如果想取当前图表第二根K线的收盘价就写iClose(NULL, 0, 1)移动平均线的取值函数是 iMA它有 7 个参数是新手看起来最头大的一个但其实拆开就没那么恐怖iMA(symbol, timeframe, period, ma_shift, ma_method, applied_price, shift)symbol品种名NULL 表示当前timeframe周期0 表示当前period均线周期20 日均线就写 20ma_shift均线偏移一般填 0ma_method平均模式0 是简单移动平均1 是指数移动平均applied_price对哪个价格取均线0 代表收盘价1 代表开盘价2 最高价3 最低价shift位置0 就是最新一根K线比如这句iMA(NULL, 0, 20, 0, 1, 0, 0)意思是当前品种、当前周期下以收盘价计算的 20 周期指数移动平均线取最新位置的值。自己编的指标也能取用iCustom函数参数结构是品种、周期、指标名称、指标参数若干个、指标线编号、位置。比如iCustom(NULL, 0, mymacd, 12, 26, 9, 2, 0)表示取自定义指标 mymacd 的第 3 条指标线编号从 0 开始在最新位置的值。这个函数非常实用因为你可以把几个指标组合起来用。3.3 判断与循环让程序自己做决定、批量处理数据取到了数据接下来就是让代码做决定。MQL4 的判断语句核心是ifif (条件) { // 条件成立时执行的语句 }条件写在小括号里条件成立就执行大括号里的内容不成立就跳过。如果只有一个语句大括号可以省略。要注意的是条件里判断两个值是否相等用的是两个等号不是赋值用的单等号。这是所有新手必踩的坑后面避坑章还会细讲。多个条件要同时满足用连接。下面是一个很经典的“价格穿越 1.0000 就报警”的完整例子把前面学的预定义数组、判断语句全用上了int mark 0; // 报警标记0 表示还没报过警 if (High[1] 1.0000 High[0] 1.0000 mark ! 1) { Alert(Symbol(), 价格向上触及 1.0000); mark 1; // 上穿报警后标记改成 1免得反复报警 } if (Low[1] 1.0000 Low[0] 1.0000 mark ! 2) { Alert(Symbol(), 价格向下触及 1.0000); mark 2; }这里的逻辑是第二根K线的最高价低于 1.0000而最新一根K线的最高价已经大于等于 1.0000说明价格刚刚向上突破了 1.0000 这个关口。mark变量用来记住“已经报过什么警了”这样程序就不会每秒钟弹一次窗口弹得你怀疑人生。还要处理海量数据的时候就得靠循环。MQL4 里有两种写法效果一样格式不同。先看 while 循环int i 0; while (i 1000) { buffer[i] iMA(NULL, 0, 12, 0, 1, 0, i) - iMA(NULL, 0, 26, 0, 1, 0, i); i; // 每跑一次i 加 1 }规则很简单只要小括号里的条件成立就一直执行大括号里的语句直到条件不成立为止。上面的代码是让 i 从 0 加到 999每次都往数组 buffer 里填一个“两条均线的差值”一共填 1000 个值。i是“i 自增 1”的简写没有这一行i 永远等于 0循环就永远停不下来那就是俗称的“死循环”。for 循环是更紧凑的写法把“初始化”“条件”“自增”这三件事都塞进小括号里for (int i 0; i 1000; i) { buffer[i] iMA(NULL, 0, 12, 0, 1, 0, i) - iMA(NULL, 0, 26, 0, 1, 0, i); }这个 for 循环的执行顺序是先执行int i 0做初始化再判断i 1000是否成立成立就执行大括号里的内容执行完跑一次i然后再回头判断……直到 i 变成 1000条件不成立循环结束。while和for你习惯用哪个都行后面的例子我统一用 for因为它把三件事写在一行看着更不容易漏。4. 新手避坑指南最容易“翻车”的 5 个细节学 MQL4 的过程中真正劝退人的往往不是“看不懂”而是“看着都对跑起来就不对”。下面这几个坑是我见过的、也是自己踩过的高频雷区每条都按“现象 → 原因 → 解决”来说希望你读完之后少走弯路。4.1 坑 1在 if 条件后面多加了一个分号现象代码是这样的if (Close[0] 1.0000); { Alert(突破了); }结果程序完全不听使唤不管价格有没有突破弹窗一直出现。原因if后面的条件括号多跟了一个分号;这个分号在 C 语言系里是一条“空语句”它把 if 变成了“如果条件成立就执行一条空的语句”。后面大括号里的 Alert 就和 if 完全没关系了成了无条件执行的代码。解决写完if (条件)后直接跟一个左大括号{中间不要打分号。分号只出现在一句完整语句的结尾比如mark 1;。我的习惯是每次写完都检查一遍 if 那一行末尾有没有多余分号检查多了自然就形成肌肉记忆了。4.2 坑 2把 当成 用现象写了if (High[0] 1.0000)编译居然不报错但程序行为完全错乱。原因MQL4 里单个是赋值操作意思是“把右边的值塞给左边的变量”。High[0] 1.0000是把 1.0000 硬塞给最新K线的最高价然后整个表达式的值就是 1.0000非零即“真”。所以不管实际价格是多少这个条件永远成立。你想要的“判断是否等于”必须写两个等号。解决凡是写“比较两个值是否相等”的地方一律用。判断里如果左边是一个变量右边是一个常量写反了编译器还能报个错但两边都是变量时写反很难发现。一个省事的办法先写常量再写变量比如1.0000 High[0]这样万一少写一个等号编译器会直接报错因为它不能给常量赋值。4.3 坑 3把最新 K 线当成第 1 根然后数组越界现象想取最新一根K线的开盘价写了Open[Bars]或者Open[Bars - 1]结果程序报错或者拿到一个完全莫名其妙的数据。原因第一是编号方向搞反了。MT4 里编号 0 才是最新K线Bars - 1是最古老的那根K线不是最新那根。第二是数组越界数组 Open 的有效下标是从 0 到Bars - 1你写Open[Bars]就已经超出范围了越界后程序可能取到垃圾值严重时直接让 MT4 崩溃。解决最新数据一律用下标 0比如Open[0]、Close[0]。如果要从最新往最老遍历标准的循环写法是for (int i 0; i Bars; i) { // 这里 i 最大是 Bars - 1不会越界 }写循环的时候条件里那个Bars - 1的上限要心里有数。实在不确定时先写一个小的固定次数比如循环 100 次跑通了再改大。4.4 坑 4指标缓冲数组放错了位置现象照着教程写指标把double buf[];定义在了start()函数的里面编译时报错说 buf 未定义或者指标画出来是一条直线。原因MT4 画指标线时需要一个“缓冲区数组”来保存曲线上每个位置的值。这个数组必须定义在文件开头、所有函数外面是全局的。如果你在start()或者某个局部区域里定义它要么作用域不对要么每次函数结束就被销毁数据根本存不下来。解决指标缓冲数组放在最顶部和extern变量放在一起。例如double buf[];然后到init()里面用SetIndexBuffer(0, buf);把它和某条指标线绑定再到start()里给它赋值。记住这个顺序指标才能正常显示。4.5 坑 5报警一直弹忘了做“只触发一次”的标记现象写了个价格突破就 Alert 报警的代码结果价格突破的一瞬间弹窗连续弹了几十个关到手软。原因start()这个函数在价格每次变动时都会运行一次。价格突破的那一秒内Tick 可能传过来十几次变动你的报警条件每次都成立代码就被执行了十几次。解决用标记变量控制触发次数就像 3.3 节里那个mark一样。条件成立时先判断标记值报警后立刻改掉标记下一次即使条件还成立也进不了报警分支。这一个细节能让你的报警程序从“灾难”变成“可用”。5. 第一个能跑的例子亲手画一条双均线差值指标前面学的知识点不少了现在把它们串起来做第一个真正能跑的东西一个画在副图里的自定义指标它画的是快线均线与慢线均线的差值类似 MACD 里的那根白线。这个例子麻雀虽小五脏俱全包含了指标文件的完整结构、变量定义、缓冲数组、循环和指标函数。5.1 完整代码与逐行拆解打开 MT4 自带的 MetaEditor 编辑器新建一个自定义指标取个名字比如MyMACD_Line然后把下面这段代码粘贴进去// 文件头部告诉 MT4 这个指标显示在副图 #property indicator_separate_window // 第一条指标线画成白色 #property indicator_color1 White // 在副图数值 0 的位置画一条水平虚线 #property indicator_level1 0 // extern 变量允许在指标参数框里直接修改周期 extern int FMA 12; // 快线均线周期默认 12 extern int SMA 26; // 慢线均线周期默认 26 // 指标线缓冲区保存曲线上每个位置的值 double buf[]; // 初始化函数指标加载时只运行一次 int init() { // 把数组 buf 指定为第 0 号指标线 SetIndexBuffer(0, buf); // 这条指标线用连续曲线来画 SetIndexStyle(0, DRAW_LINE); return(0); } // 触发函数每次价格变化时运行 int start() { // 只计算还没算过的K线避免每次全部重算 int limit Bars - IndicatorCounted(); for (int i 0; i limit; i) { // 快线指数均线减慢线指数均线结果就是差值为当前K线的值 buf[i] iMA(NULL, 0, FMA, 0, 1, 0, i) - iMA(NULL, 0, SMA, 0, 1, 0, i); } return(0); }稍微解释几个关键点。#property开头的三行是“告诉 MT4 怎么展示这个指标”indicator_separate_window表示画在价格图下方的副图区域indicator_color1 White指定线的颜色indicator_level1 0是在数值 0 的位置画一条参考虚线。SetIndexBuffer(0, buf)是把数组 buf 绑定到第 0 号线SetIndexStyle(0, DRAW_LINE)是让这条线以连续曲线的形式显示。这两行必须放在init()里因为 init 只在指标加载时执行一次属于“设置环节”。start()里的核心是这句buf[i] iMA(NULL, 0, FMA, 0, 1, 0, i) - iMA(NULL, 0, SMA, 0, 1, 0, i);iMA(NULL, 0, FMA, 0, 1, 0, i)这 7 个参数分别是品种为当前、周期为当前、均线周期取 FMA12、偏移为 0、计算模式取 1指数移动平均、价格种类取 0按收盘价、位置取 i。整句话的意思是在第 i 根K线的位置用快线均线值减去慢线均线值把差值存进 buf[i]。循环从 0 开始最新最右边的K线算起一路往左把当前图表上所有没算过的K线都算一遍。limit Bars - IndicatorCounted()是一个优化小技巧。IndicatorCounted()返回的是“已经计算过、有值的K线数量”用总 K 线数减掉它就得到“这次需要新计算的K线数”。这样价格变动时程序只需要补算最新变化的几根K线不用把整张图几千根全重算一遍速度会快很多。这是从老教程里学来的经典写法新手直接照用即可。5.2 从粘贴代码到曲线出现五步走代码写完接下来是把这根曲线弄到图表上。第一次做的时候一步一步来别跳步骤。第一步确认代码保存为自定义指标文件。在 MetaEditor 里按 CtrlS 保存文件名要和代码里新建时设定的名字一致。第二步编译代码。按 F7 或者在菜单里选“编译”。编译结果看底部信息栏如果显示 0 个错误说明代码没问题如果有错误双击那条错误信息光标会自动跳到出错的那一行对照着检查。第三步回到 MT4 的价格图表在导航窗口里找到“自定义指标”分类展开它找到你刚编译好的 MyMACD_Line。第四步把这个指标拖到图表上或者右键指标选择“附加到图表”。这时图表下方应该出现一个副图窗口里面有一条白色的曲线上下波动围绕 0 轴上下穿行。第五步按下 CtrlF5 或用快捷键切换模板确认指标参数里能看到“FMA”和“SMA”两个可调参数。试着把 FMA 改成 5、SMA 改成 20曲线会立刻变样。这时候你就成功拥有了第一个自己写的、参数可调的指标。如果第一次拖进去没看到曲线先去检查编译有没有过再看副图窗口是不是被折叠起来了。代码本身没问题的话十有八九是编译这步出了岔子。5.3 改造练习换颜色、加报警把它变成你的专属指标能跑通之后就可以玩起来了。改颜色是最简单的把#property indicator_color1 White里的 White 改成 Red、Yellow 之类的颜色名重新编译曲线就变色了。想把曲线变成柱状图把线型常量从DRAW_LINE换成DRAW_HISTOGRAM编译后曲线就变成一根根的柱子看起来更像传统 MACD 的柱状展示。再进阶一点结合前面学过的判断语句给指标加一个“金叉时报警”的功能。比如快线差值从下方穿越 0 轴就意味着快线上穿了慢线相当于金叉。在 start() 里加上if (buf[1] 0 buf[0] 0) { Alert(快线上穿慢线); }这段的意思上一根K线的差值还在 0 以下最新一根已经大于等于 0说明刚刚完成上穿触发一次报警。改完之后再编译、再拖到图表上跑一跑体验一下“自己写的指标给自己报信”的感觉。6. 下一步学什么从指标走向 EA 自动化交易到这一步你已经不是完全零基础了你认识了变量、函数、数组会取行情数据能写判断和循环还做出了第一个自定义指标。下一步有三条路按顺序走最稳。第一条路大量读别人写的指标源码。MQL4 的好处是资源多新手论坛里随便就能找到一堆现成交叉类、通道类、背离类指标源码。不要光看要带着问题去读“它的 start() 里为什么先写这一句这个数组为什么这样初始化”读不懂的函数名就去查手册查完回来再看几轮下来进步极快。第二条路学习 Expert Advisor 的基本结构。EA 和指标最大的区别是EA 能替你下单。指标只在 start() 里画线EA 的 start() 里还能调下单函数。你需要掌握几个新函数OrderSend()用来开仓OrderClose()用来平仓还有OrderType()、OrderTicket()这类订单查询函数。先别急着写完整策略可以做一个最简单的每次价格突破 N 周期高点就买入突破低点就卖出能跑通就成功了。第三条路一定会用到的回测。写好 EA 后点开 MT4 的“策略测试器”选择品种、周期和起止日期让历史数据帮你检验策略有没有赚头。我第一次写完一个均线金叉 EA回测后才发现它在震荡行情里会反复开仓亏钱这才意识到“想法看起来对”和“实际能跑赢”完全是两回事。再提一个伴随所有这些路的小习惯每次动手改代码前先复制一份原文件备份。MQL4 改起来很容易改坏了想找回原来的版本没有备份就只能靠记忆重写那种感觉糟透了。从那以后我每次写代码都强制自己先备份一份再动刀改完再备份一个新版本。这个小习惯让我少走了不知多少弯路你最好也养成。希望帮到你。本文还有配套的精品资源点击获取