ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

MQL4编程入门:从变量到循环,掌握MT4指标与EA开发基础

MQL4编程入门:从变量到循环,掌握MT4指标与EA开发基础 简介面向外汇交易者及编程入门用户的MQL4开发教程系统梳理MetaTrader 4平台中自定义指标与EA智能交易程序的编写方法。内容围绕编程基础四大模块展开自定义变量的类型定义、extern附加变量在策略参数调优中的应用、自定义函数的构造与调用、数组的创建与元素引用并讲解开盘价、收盘价等预定义数组的历史数据取值方式帮助读者构建完整的脚本开发知识链。资源为单个doc格式教程文档压缩包仅197KB内容精炼、章节紧凑适合快速通读后直接对照练习。目前已获得389人次浏览学习属于入门轻量型资料。教程源自外汇程序化交易实战系列每章均配有可运行的代码范例并对变量生命周期、函数返回值、数组索引边界等易错点做了专门说明能够引导零基础用户逐步书写规范的自定义指标与EA框架是进入MT4量化交易开发领域的低成本入门材料。1. 先搞懂一个概念MQL4 到底是什么很多人在MT4上看盘久了都会冒出一个念头那些均线、MACD是怎么画出来的能不能按自己的规则来一条这就是MT4 MQL4编程入门最常见的起点。简单说MQL4是MT4平台自带的编程语言全称MetaQuotes Language 4。可以写三类东西自定义指标、脚本小程序、EA自动交易程序让代码自动判断、自动下单。它语法接近C语言又比C简单MT4自带编辑器就能写。这份教程的目标是让你从没写过代码到能读懂并写出自己的第一行MQL4代码。不用先学编程把变量、数组、判断、循环过一遍那些看起来玄学的指标就能变成你能控制的代码。2. 从变量开始写 MQL4 的第一块积木现在正式开始写代码。如果你完全没接触过编程可以把程序理解成一条处理数据的流水线。数据从哪儿来要么来自行情要么来自你写死在代码里的数值要么来自使用者的输入。而变量就是这条流水线上用来暂时存放数据的小盒子。为什么一上来就要先学变量因为在MQL4里任何程序——不管是指标、脚本还是EA——本质上都是在操作数据。你得先知道数据怎么存、怎么取才能谈到怎么判断、怎么循环。这一章我们把变量和函数这两个最基础的概念讲透它们是你之后所有代码的积木。2.1 四种变量类型先认识 int、double、string、bool初学者最常见的困惑是为什么不能直接写一个a3就完事非要写成int a3因为在MQL4里每个变量在第一次使用时都必须明确告诉程序两件事它是什么类型、它叫什么名字。类型决定这个盒子能装什么数据名字决定你以后怎么找到它。MQL4里最基本的变量类型有四种先把这四个记住后面所有程序都够用类型定义符干什么用的举例整型int存整数正数负数都行int 数量5;双精度小数double存带小数的数字价格就用它double 现价1.0850;字符串string存文字比如品种名、报错信息string 名称EURUSD;逻辑型bool只能存 true 或 false真/假bool 是否报警true;定义变量的标准写法是类型 变量名 初始值。初始值可以暂时不写。举个例子int mark; // 定义一个整型变量名字叫 mark没赋值 bool 触发开关 true; // 定义逻辑型变量名字是触发开关初值为 true这段代码里第一行只创建了 mark 这个变量没给任何初值第二行创建变量触发开关的同时把初值设为 true。有一点很关键类型定义词只在创建变量时用一次。创建之后再用到这个变量直接写名字就行不能再加 int、bool 这类词否则就变成重复定义编译时会报错。需要提醒的是MQL4 允许变量名使用中文这一点对中文使用者很友好。我第一次学的时候把周期、均线、报警开关这些名字直接写成中文代码读起来比满屏的英文好理解得多。不过要注意名称取完之后从头到尾拼写必须完全一致尤其不要一会儿写周期一会儿写周其这种错误最隐形。2.2 extern 附加变量把参数交到使用者手里看MT4自带的MACD指标时你应该注意过它的参数设置框里有三个数字12、26、9。这三个数字能直接在图表属性里改改完指标线马上变。这种使用者能修改的参数在MQL4里叫附加变量。附加变量的定义方式很简单在普通变量定义前面加一个 extern 关键字extern int 周期 9; // 外部可修改的整型变量默认值 9当程序里出现 extern 变量时MT4 图表加载指标后你可以在输入参数选项卡里看到并修改它的值不用去碰代码本身。这就是 MACD 那个 12、26、9 背后的实现原理。所以凡是希望使用者能自由调整的参数都建议设计成 extern 变量。这里有个使用习惯建议把那些你自己都可能反复调的数据比如均线周期、报警价位、判断阈值尽量都做成 extern。否则每次想调参数都要改代码重新编译不仅麻烦还容易改出新错误。附加变量本质也是变量规则和普通变量一样类型、名称、初值三者都要齐全。2.3 自定义函数把逻辑装进小盒子如果你有一段计算逻辑要在程序里用很多次比如算3*x2*y最笨的办法是每次用到都重写一遍。MQL4 提供了函数这个机制相当于把这段逻辑装进一个带名字的小盒子想用的时候只需要喊名字。先看一个最经典的数学例子。数学函数 ft(x,y)3x2y写成 MQL4 的代码就是int ft(int x, int y) // 函数头部返回类型 int函数名 ft两个参数 x 和 y { int temp; // 函数体内部定义一个临时变量 temp 3*x 2*y; // 算出结果存入 temp return(temp); // 结束函数把 temp 的值返回给调用处 }函数定义分两个部分。头部第一行声明了返回类型、函数名和参数列表大括号里是函数体也就是实际执行的运算语句。return 语句表示函数到此结束并把括号里的值作为运算结果送出去。上面这个函数也能简写成一行int ft(int x, int y) { return(3*x2*y); }效果完全一样。用起来更简单只要函数名写对、参数个数和类型一致就能直接调用int 结果 ft(4, 5); // 程序把 4 传给 x把 5 传给 y返回 23 给结果函数还有一种特殊情况有的函数只执行一系列动作不需要送回任何结果这时返回类型就写成 void。比如void 更新界面() { // 这里执行更新界面的一系列语句不需要 return 值 }void 函数运行完就结束不留返回值适合那些做了就是成功的操作。再强调一下作用域函数内部定义的变量比如例子里的 x、y、temp只在函数运行的那段时间里存在。函数一结束这些变量就自动注销函数外部完全看不到它们。这也意味着你在不同函数里可以放心使用同名的变量互不干扰。2.4 容易出错的习惯先定义再使用这一章的最后说一个MQL4新手最容易犯的习惯错误在还没有创建变量的情况下就直接拿它来赋值或判断。MQL4的原则非常明确——所有变量、数组、函数都必须先定义创建后使用没有任何例外。比如有人想记录一个计数变量直接写i i 1;但前面根本没有定义过 i编译时就会报错变量未声明。正确做法是在这一句之前先加上类型定义int i 0;。类似的还有一个高发问题运行到某个函数时才发现里面用到的一个变量根本没传进来。遇到这种情况不要急着一行行找错先回到变量定义区检查一次名称、类型和定义位置大多数报错都能在这里找到答案。还有一个很容易被忽视的细节MQL4 对大小写敏感Close和close会被当成两个不同的名字。很多指标代码里系统预定义数组用的是大写开头自己写的变量用什么命名习惯都可以但必须前后一致。把这些习惯在起步阶段固定下来后面写代码会少走很多弯路。3. 数组与行情数据让程序读懂K线第2章学完你已经能让程序存储单个数值了。但现实世界的行情数据远不止一个数图表上几千根K线每根都有自己的开盘价、最高价、最低价、收盘价和成交量。如果你打算用变量把这些数据都存下来——Open1、Open2、Open3、Open4……写几百行变量名代码会立刻失控而且根本没法用循环去遍历。这一章解决的就是大量同类型数据的问题。你将学会用数组来组织数据并且直接调用MT4预定义好的行情数组和指标函数。3.1 数组一列同类型变量的集合先看一个最简单的例子int aa[4] {4,3,2,1}; // 一个叫 aa 的整型数组长度 4同时赋初值这样写等于一次创建了 4 个整型变量分别用 aa[0]、aa[1]、aa[2]、aa[3] 来访问。注意编号是从 0 开始的不是从 1 开始aa[0] 的值是 4aa[1] 是 3aa[2] 是 2aa[3] 是 1。这个从0数起的规则是数组最反直觉、也最容易出错的点。数组的定义同样遵循先建后用而且创建时比较灵活可以只定名称不定个数可以先规定长度不赋初值也可以规定长度并赋一部分初值。下面几种写法都是合法的int bb[]; // 创建数组 bb不设定元素个数后面再处理 int cc[8]; // 创建数组 cc8 个元素不赋初值 int dd[3] {9,8,7}; // 创建数组 dd3 个元素赋初值 int ee[9] {0,1,2,3}; // 创建数组 ee9 个元素只给前 4 个赋初值使用数组时有两条硬规矩。第一除了新建时能整体赋初值之外之后给数组赋值必须一个一个来必须精确到具体元素。第二引用数组时一次也只能引用一个元素。所以如果你想把一个数组整列都用上就得配合循环逐个处理这也正是下一章循环的基础。动手试一个假设 dd[3]{9,8,7}执行dd[2]1;之后数组变成 {9,8,1}。这一句把第 3 个元素下标 2的值从 7 改成了 1前两个元素完全没动。理解了这种按下标定位的方式你就能明白为什么后面所有指标脚本都在用数组和下标去访问历史行情。3.2 预定义数组Open、High、Low、Close 直接拿来用数组这么好用MT4 干脆帮你把K线数据都装成了现成的数组这就是预定义数组。常见的有开盘价 Open[]、最高价 High[]、最低价 Low[]、收盘价 Close[]、成交量 Volume[]、时间 Time[]。它们不需要你创建启动就能用。这些数组存的是双精度小数Time[] 是日期时间型你必须知道的是它们的编号规则MT4 把图表从右往左数最右边第一根K线编号为 0往左第二根编号为 1第三根编号为 2以此类推。注意方向和大家习惯的从左往右看正好相反。下面几个例子说明这套编号double latest Close[0]; // 这一根最新一根K线的收盘价 double prev Close[1]; // 上一根K线的收盘价 double prev2 Close[2]; // 再往前一根K线的收盘价 double now High[0]; // 最新一根K线的最高价所以写指标报警时如果你看到代码里出现Close[0]它代表的永远是当前最新K线的收盘价不是昨天那根。补充一句这些是数组访问时一定要用方括号[]别写成圆括号。除了K线数组MT4 还预定义了几个直接可用的变量Ask 和 Bid 是当前的实时卖出价和买入价都是 double 类型Bars 是当前图表上的K线总数int 类型Digits 是当前货币对的小数位数不含日元的一般是 4 位含日元的是 2 位Point 是当前品种一个点的大小不含日元的是 0.0001含日元的是 0.01。这几个在你写报警、写止损的时候会经常用到。3.3 指标函数任意品种、任意周期都能取值如果只在自己的图表上取数据用 Open[]、Close[] 就够了。但很多时候你想取别的品种、别的周期的价格比如想在 EURUSD 的 1 小时图上同时读取 GBPUSD 的 4 小时图第 3 根K线的收盘价。这时候预定义数组就不够用了得请出功能更全的指标函数。先看最基础的一组iOpen(symbol, timeframe, shift) // 开盘价 iClose(symbol, timeframe, shift) // 收盘价 iHigh(symbol, timeframe, shift) // 最高价 iLow(symbol, timeframe, shift) // 最低价 iVolume(symbol, timeframe, shift) // 成交量 iTime(symbol, timeframe, shift) // 所属时间它们统一有三个参数第一个写货币对名称比如 EURUSD、GBPUSD第二个写K线周期第三个写位置序号就是我们刚学的下标0 是最新一根。周期有很多预定义常量可以直接用PERIOD_M1 是 1 分钟PERIOD_M5 是 5 分钟PERIOD_M15 是 15 分钟PERIOD_M30 是 30 分钟PERIOD_H1 是 1 小时PERIOD_H4 是 4 小时PERIOD_D1 是日线PERIOD_W1 是周线再往上还有月线 PERIOD_MN1。结合参数试读几个例子iOpen(USDJPY, PERIOD_H1, 0) // 美元兑日元 1 小时图最新K线的开盘价 iClose(EURUSD, PERIOD_H4, 2) // 欧元兑美元 4 小时图第 3 根K线的收盘价 iClose(GBPUSD, PERIOD_H1, i) // 英镑兑美元 1 小时图第 i1 根K线的收盘价 iHigh(NULL, 0, 0) // 不指定品种和周期当前图表当前周期最新K线的最高价最后一行里的 NULL 和 0 是个偷懒写法NULL 表示当前图表正在用的品种0 表示当前图表正在用的周期。换句话说这句代码在哪个图表上运行就用哪个图表的数据。这也是很多自定义指标默认写法因为指标本来就是在自己图表上画的。再进阶一点移动平均线这类指标也有现成函数最常用的是 iMA它参数最多一共 7 个iMA(symbol, timeframe, period, ma_shift, ma_method, applied_price, shift)从左到右分别是品种、周期、均线周期数、均线偏移、平均模式、价格种类、位置。平均模式用常量表示MODE_SMA 是简单平均MODE_EMA 是指数平均MODE_SMMA 是平滑平均MODE_LWMA 是线性加权平均。价格种类常用 PRICE_CLOSE收盘价、PRICE_OPEN开盘价、PRICE_HIGH最高价、PRICE_LOW最低价。举个例子iMA(EURUSD, PERIOD_H1, 20, 0, MODE_SMA, PRICE_CLOSE, 0)这表示欧元 1 小时图上以收盘价计算的 20 期简单移动平均线取最新K线位置的值。如果碰巧要取自己编的指标还有 iCustom 函数括号里依次填品种、周期、指标名称、指标参数、指标线编号和位置。看到这里你应该明白了MT4 里几乎所有指标都能当函数调用规则都是品种、周期、位置三件套记熟了就不再怕黑匣子。4. 判断与循环让程序会思考、会重复前面几章的内容相当于你有了原材料变量、数组、行情数据和加工工具函数。但程序还不会动——它并不知道什么时候该报警也不知道怎么把几千根K线逐个算一遍。这一章补上最核心的两块能力条件判断和循环。判断让程序在面对不同的行情状态时做出不同的决定循环让程序用同样的计算规则去处理成千上万根K线。这两样加在一起指标和报警脚本的骨架就立起来了。4.1 if 判断满足条件才执行if 语句是程序最基础的决策器官规则一句话就能讲完如果小括号里的条件成立就执行大括号里的语句如果不成立就跳过这一整块。它的标准格式如下if (条件) { // 条件成立时要执行的语句 }在指标报警里我们常要判断价格是否向上穿越某个价位。比如想判断价格从低于 1.0000 变成上穿 1.0000需要同时满足两个条件上一根K线的最高价低于 1.0000并且当前K线的最高价已经大于或等于 1.0000。写成代码就是这样if (High[1] 1.0000 High[0] 1.0000) { Alert(Symbol(), 价格向上触及 1.0000); }这段代码里表示并且两个条件必须同时为真括号里的整段判断才算成立。Symbol() 返回当前品种名Alert() 是弹出提示框。整个程序的逻辑就是上一根还没到 1.0000这根到了说明价格发生了向上穿越此时报警一次。判断条件里经常用到的比较符号需要记一下是等于注意是两个等号!是不等于、、、分别是大于、小于、大于等于、小于等于。4.2 if...else 分支不成立时走另一条路很多时候我们不能只处理成立那一侧的情况价格下穿也要处理。这就需要 if...else条件成立执行第一段不成立则执行 else 后面第二段。看下面这个同时处理上穿和下穿报警的完整例子int mark 0; // 报警标记0 为没有报过警1 为已上穿报警2 为已下穿报警 if (High[1] 1.0000 High[0] 1.0000 mark ! 1) { Alert(Symbol(), 价格向上触及 1.0000); mark 1; // 上穿报警后标记改为 1 } else if (Low[1] 1.0000 Low[0] 1.0000 mark ! 2) { Alert(Symbol(), 价格向下触及 1.0000); mark 2; }这个例子建议初学者反复看几遍里面有个非常典型的技巧用 mark 变量当报警记忆。它的初值是 0表示两个方向都还没报过警一旦上穿报警发生mark 改成 1之后即使再次满足上穿条件因为 mark ! 1 不成立就不会重复报警。同样的道理下穿报警后 mark 改成 2。这个状态标记思路在交易程序里极其常用。写 if 语句时还要注意一个细节只有语句后面才需要打语句结束符;条件、大括号、小括号后面都不能加。如果你觉得整个函数体只有一句要执行大括号可以省略比如if (条件) 报警;。但刚入门时我建议宁可多写大括号也不要省养成习惯后可以降低很多低级错误。4.3 while 与 for 循环处理几千根K线一根K线有开盘、最高、最低、收盘、成交量这些值加上各种移动平均线、MACD计算结果图表上还有几千根K线。如果让你把这几千个数据都手动写出来没人做得到。循环就是为这种海量重复处理而生的。先看 while 循环它的结构是while (条件) { // 只要条件成立就一直执行的循环体 }执行过程是先看条件成立就执行大括号里的语句执行完再看一次条件还成立就再执行直到条件不成立才停下来。这里要看清楚它和 if 的区别if 只执行一次while 只要条件为真就会反复执行这也是它名字里循环二字的由来。下面用一个真实任务演示循环的价值——给数组 buffer[] 的前 1000 个元素依次存入快线均线值减去慢线均线值extern int 快线 12; // 快线周期 extern int 慢线 26; // 慢线周期 double buffer[]; // 用来存计算结果的数组 int i 0; // 循环计数变量 while (i 1000) { buffer[i] iMA(NULL, 0, 快线, 0, MODE_EMA, PRICE_CLOSE, i) - iMA(NULL, 0, 慢线, 0, MODE_EMA, PRICE_CLOSE, i); i; // 每循环一次i 增加 1 }循环体里做了两件事第一句把两条指数均线在当前下标的差值存入 buffer[i]第二句i;让 i 在原有基础上加 1。随着循环一轮轮执行i 从 0 涨到 999再执行完最后一次循环后 i 等于 1000此时i 1000不再成立循环结束。1000 个位置的值就这样全部算完了。如果不写 ii 永远停在 0循环就变成死循环程序卡死。4.4 for 循环更紧凑的写法while 方案已经能干活了但 MQL4 里更常见的是 for 循环它的原理和 while 完全一致只是把三部分压缩进了一行小括号。把上面的例子改写extern int 快线 12; extern int 慢线 26; double buffer[]; for (int i 0; i 1000; i) { buffer[i] iMA(NULL, 0, 快线, 0, MODE_EMA, PRICE_CLOSE, i) - iMA(NULL, 0, 慢线, 0, MODE_EMA, PRICE_CLOSE, i); }对比 while 的写法能看到两处移动int i 0;被移到了 for 括号的第一格里i;被移到了条件后面。for 循环的执行顺序严格分成四步。第一步先执行小括号里的第一格也就是初值语句int i 0;这一句在整个循环里只执行一次第二步判断第二格i 1000是否成立不成立就跳出循环成立则继续到第三步第三步执行大括号里的循环体第四步执行第三格i让 i 增加 1然后回到第二步继续判断。这就是 for 循环完整的生命周期。每次访问K线数据时循环体里那个 i最终会成为你访问数组和指标函数位置参数的依据。入门阶段有一个强烈建议所有循环都从i0或i1开始并确保循环内部每一轮都会推进 i 的值i这样就不会踩到死循环这个经典大坑。5. 新手避坑指南五个我替你踩过的坑我刚开始学MQL4那阵子几乎把初学者能犯的错误全犯了一遍。后来我养成了一个习惯看到报错先不慌先看报错信息指在编辑器的哪一行再对照常见原因去排。MetaEditor 的编译日志其实给得很直白双击日志里的报错行光标会自动跳到出错的那一行代码。初次看到一大串英文不要慌你先看最前面的关键字undeclared identifier 是变量未声明unbalanced 是括号不配对; expected 是分号丢了或多了left side of assignment 是赋值左侧写了一个不能赋值的东西。把错误分好类再往下面这五条里对应排查就快了。下面这五条每条按现象、原因、解决的顺序写你可以把它当成一份排查清单遇到对应症状时直接回来对照。5.1 编译报错变量没有定义就这么用现象写完代码点编译编辑器在某个变量名下面报错说它是 undeclared identifier未声明的标识符。原因九成是变量没定义就使用或者变量名字前后写得不一致。比如函数开头写的是int mark 0;到函数中间却写if (markk 0)只是多敲了一个字母MQL4 就会把 markk 当成一个从未出现的新名字。解决看到这个报错先回到变量定义区确认三件事有没有定义这个变量名字拼写是否完全一致类型定义词是否符合创建规则。中文变量名也容易在这里翻车比如一会儿写周期一会儿写周其建议定义一个就复制一个不要手打。5.2 翻车现场中文符号惹的祸现象代码看来看去逻辑都对但编译器就是报错有时整行标红甚至中文注释都显示异常。原因输入法没切换回英文半角模式。MQL4 的编辑器只认英文标点小括号、大括号、分号必须是半角状态下的(){};。中文输入法敲出来的逗号和分号是全角字符编译器根本不认。解决写代码时把输入法切到英文模式养成习惯。如果是在中文输入法状态下连打了一整段代码先整体检查有没有混进全角逗号、全角分号。比较快的排查办法是把报错那一行删掉重新输入一遍很多时候问题就出在一个看不见的中文标点上。5.3 指标线全平数组忘了赋值现象写了一个自定义指标加载到图表上不报错可指标线就是一条水平的直线数值永远是 0。原因多数情况是声明了指标缓冲区数组但在 start() 函数里忘了给它循环赋值或者 SetIndexBuffer 绑定数组时写错了对应编号。我的排查经验是先看数组有没有绑定再看循环有没有跑最后看计算式里的数据源是不是空的。比如想算均线差值却引用了两个根本没定义过的函数参数结果自然是 0。解决在 start() 函数里补上对 buffer[i] 的赋值语句并且确认循环次数正确覆盖了所有K线。建议每写完一个自定义指标先在图表上把指标线数值调出来看是不是每个位置都有值从第一个元素开始逐个核对这样定位很快。5.4 参数改了没反应忘了重新编译现象把 extern 变量的默认值从 12 改成 20点编译没报错图表上的线纹丝不动。原因第一修改源代码之后没有重新编译。extern 是编译期参数改了代码必须重新编译才生效第二图表上加载的指标仍然是旧版本没有把新编译生成的指标重新拖入或者 MT4 还停留在旧的加载状态。解决改完 extern 之后在 MetaEditor 里点编译按钮确认编译日志显示成功再回到图表把原来的指标删掉重新拖入一次。如果还不行就把图表切换一下周期或点一下刷新让它重新加载指标。5.5 位置搞反Close[0] 是最近这一根现象写完报警逻辑发现报警时机总比预期晚一根K线比如明明这根已经超过 1.0000却等下一根才触发。原因这是对 MT4 编号规则的理解偏差。MT4 的K线编号是从右往左数的最右边最新一根的编号是 0Close[0] 是当前这根K线的收盘价而 Close[1] 才是它左边那一根。初学者按从最开始数的直觉来用会把所有下标都错位一根。解决在正式开始写报警或 EA 之前先在图表上打印几个关键值验证。比如在代码里把 Close[0]、Close[1] 的值显示出来和图表上的K线收盘价逐一对照。把0 是最新这条规则刻进脑子后面所有指标函数的位置参数 shift 也都遵循同样规则通用的规律记熟了就不会再错。把这几条保存下来等于有了一份轻量的坑位地图。以后遇到编译错误或指标异常按未声明→符号→赋值→编译→编号这个顺序排查一遍大部分问题都能自己解决。6. 下一步学什么从指标线到完整报警程序到这里MQL4 的入门基础你已经完整过了一遍变量、函数、数组、行情数据、判断、循环。每个概念单独看都不大但组合起来已经能完成很多实用功能。接下来怎么走给你三条具体的路径。第一件事把画一条指标线的完整例子亲手跑通。代码量不大却用到了指标文件结构、数组绑定、循环赋值、iMA 取值值得你敲一遍、编译一遍、加载一遍。跑通后试着把两条均线的周期从固定值改成 extern再试着给它加第二根不同颜色的线改动不大但对理解指标线是怎么来的帮助非常大。第二件事做一个会报警的小程序。有个经典思路用 SendMail 把行情发送到邮箱实现远程接收行情提醒。用到的知识全在基础范围内TimeLocal() 取当前时间Symbol() 取当前品种Close[0] 取最新收盘价自己设定发信间隔。把它当一个正式项目来做能学会怎么把前面的知识点串起来。第三件事再往后才是 EA 自动交易。自动交易的本质是指标判断 下单函数 风险控制核心难点已经不在语法而在策略逻辑的保护上。建议先用模拟账户反复测试再考虑真实环境这一点无论如何强调都不过分。学习阶段核心内容练手目标第一阶段变量、数组、判断、循环能读懂别人写的指标代码第二阶段指标函数、自定义指标结构画出自己想要的指标线第三阶段报警、邮件、订单函数做一个能用的报警小工具第四阶段EA 框架、下单逻辑、风控跑通一个模拟 EA最后说个我自己吃的教训。我刚学会写循环那几天急着写一个遍历所有K线找最高点的程序没有限制循环次数也没有在任何地方打印中间结果结果程序跑起来后界面卡死只能强退。从那以后我每次写带循环的程序都会强制自己走一遍检查循环条件有没有可能在某个时刻不成立循环体里能不能保证至少一个变量在推进关键的中间值有没有打印出来确认。这三点花不了多少时间却帮我避免了一大半程序不动了的麻烦。希望帮到你。本文还有配套的精品资源点击获取
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表