MQL5教程 02 标准语法 文章目录一、事件处理函数1、OnInit / OnDeinit / OnTick2、OnTimer3、OnTrade / OnTradeTransaction4、OnChartEvent5、OnTester6、OnTesterInit / OnTesterPass / OnTesterDeinit7、OnBookEvent8、OnCalculate9、OnStart二、初级语法1、常用基本数据类型2、常量(1)标准常量(2)自定义常量3、变量(1)预定义变量(2)自定义变量4、函数(1)系统自带的函数(2)自定义函数(3)函数转换(4)字符串函数5、变量和函数的作用域(1)外部参数变量(2)全局变量(3)局部变量(4)函数引用参数变量(5)静态局部变量三、中级语法1、程序端全局变量2、枚举类型3、结构体类型4、数组5、循环判断语句6、算术、关系、逻辑运算四、高级语法1、类的创建2、对象的创建3、带参数的类和对象的定义4、类的封装5、类的函数重载6、类的成员函数提前声明7、const类型变量和函数8、类的静态成员函数9、类的静态成员变量10、类的继承(1)公有继承(2)私有继承(3)保护继承(4)三种继承方式总结(5)子类创建与销毁对象的执行顺序(6)成员初始化列表(7)函数的重载与重写11、类的多态与虚函数、纯虚函数、抽象类一、事件处理函数1、OnInit / OnDeinit / OnTickOnInit:当指标或EA第一次加载时,执行该函数。OnDeinit:卸载指标或EA,或者关闭加载该指标或EA的图表时,执行该函数。OnTick:在价格每波动一次,执行一次该函数。intOnInit(){printf("init");return(INIT_SUCCEEDED);// 告诉程序初始化成功,可以执行OnTick()// 如果是不是返回 INIT_SUCCEEDED,比如返回 INIT_FAILED,则不执行 OnTick()}voidOnDeinit(constintreason){printf("deinit");}voidOnTick(){printf("tick");}2、OnTimer计时器设定的固定时间间隔,执行该函数。intOnInit(){EventSetTimer(3);// 设定定时器,每隔3s,执行一次OnTimer函数printf("init");return(INIT_SUCCEEDED);}voidOnDeinit(constintreason){printf("deinit");}voidOnTick(){// TimeLocal() 返回运行 MT5 客户端的那台计算机当前操作系统的时间。if(TimeLocal()=D'2025.2.6 17:13:00'){EventKillTimer();// 清除定时器}}voidOnTimer(){printf(TimeToString(TimeLocal(),TIME_DATE|TIME_SECONDS));// 这里的 | 是按位或运算。这里显示时间是按 bit 位设置的开关。// TIME_DATE 是0001,TIME_MINUTES 是0010,TIME_SECONDS 是0100}3、OnTrade / OnTradeTransactionOnTrade:对即时交易或者挂单进行开仓、平仓、修改订单,都执行该函数。由于该函数难以把控,一般不使用。OnTradeTransaction:事件触发条件同 OnTrade,但由于丰富的形参可以更精准地定位需求,所以常使用该函数。intOnInit(){printf("init");return(INIT_SUCCEEDED);}voidOnDeinit(constintreason){printf("deinit");}voidOnTick(){}voidOnTradeTransaction(constMqlTradeTransactiontrans,constMqlTradeRequestrequest,constMqlTradeResultresult){if(trans.type==TRADE_TRANSACTION_REQUEST)// trans.type == TRADE_TRANSACTION_REQUEST: 服务器收到了交易请求,准备开始处理,此时还未真正开仓。// 如果要确定多单已经真正做进去(成交)了,需要监听 TRADE_TRANSACTION_DEAL_ADD(即交易记录写入了账户历史)。{if(request.action==TRADE_ACTION_DEALrequest.type==ORDER_TYPE_BUY)// TRADE_ACTION_DEAL 即时交易// ORDER_TYPE_BUY 订单类型是买单 注:空单平仓视为开多单{Alert("你已经开多单");}}}4、OnChartEventOnChartEvent:当在图表上进行一些操作时,触发事件,执行该回调函数。intOnInit(){printf("init");return(INIT_SUCCEEDED);}voidOnDeinit(constintreason){printf("deinit");}voidOnTick(){}voidOnChartEvent(constintid,constlonglparam,constdoubledparam,conststringsparam){if(id==CHARTEVENT_CLICK){Alert("你单击了鼠标"+"x:"+lparam+"y:"+dparam);}}5、OnTesterOnTester:在EA交易测试历史数据完毕后,执行该函数。核心作用是自定义一个“打分指标”(优化标准)。 比如,不想单纯以“利润最大”来选参数,而是想以“利润 / 最大回撤”的比值来选参数,就可以用它。OnTester的返回值是 double 类型。这个返回值的作用是在优化选择最大定制,在结果中进行排名。inputinti=10;intOnInit(){printf("init");return(INIT_SUCCEEDED);}voidOnDeinit(constintreason){printf("deinit");}voidOnTick(){}doubleOnTester(){printf("执行完了!");// 这句代码并不会在“专家”选项卡中显示,而是需要“优化结果”选项卡中任意双击一行,// 然后在其右边的“日志”选项卡中显示。return(11.0);}6、OnTesterInit / OnTesterPass / OnTesterDeinitEA优化时,触发这些函数。详细说明,暂略。7、OnBookEventOnBookEvent:在市场深度变化时触发。在ICMarkets中,只有实盘有数据,虚拟盘没有市场深度数据(虽然图表上也显示,但是后台是获取不到的)。intOnInit(){// 1. 刚启动时,先强制释放一次,把可能残留的旧订阅洗干净MarketBookRelease(Symbol());// Symbol() 返回当前图表的交易品种名称// 2. 重新订阅当前图表的品种if(MarketBookAdd(Symbol())){Print("-- ",Symbol()," 市场深度订阅成功!");return(INIT_SUCCEEDED);}else{Print("-- 订阅失败!");return(INIT_FAILED);}}voidOnDeinit(constintreason){// 退出时必须释放,因为卸掉EA,订阅也不会主动取消。MarketBookRelease(Symbol());Print("-- 成功释放订阅。");}voidOnBookEvent(conststringsymbol){printf(symbol+"这个货币市场深度发生了变化");}8、OnCalculateOnCalculate:指标专有的事件处理函数,每个新的 tick 到来,触发一次该函数。intOnInit(){return(INIT_SUCCEEDED);// 返回 INIT_SUCCEEDED,才能执行 OnCalculate 函数。}intOnCalculate(constintrates_total,// 当前图表中加载的全部历史 K 线总数constintprev_calculated,// 之前计算过的 K 线数constdatetimetime[],constdoubleopen[],constdoublehigh[],constdoublelow[],constdoubleclose[],constlongtick_volume[],constlongvolume[],constintspread[]){printf(open[1]);return(rates_total);// OnCalculate 函数的返回值会赋值给变量 prev_calculated,// 下次再触发 OnCalculate 函数时,prev_calculated就会得到上一次的 OnCalculate 函数返回值。}9、OnStartOnStart:脚本专有的事件处理函数,加载脚本后,只执行一次。voidOnStart(){Alert("脚本执行完了!");}二、初级语法1、常用基本数据类型整型 int浮点型 double字符型 char字符串 string颜色 color时间 datetime空类型 void,void类型不能声明变量,只能用来声明函数,表示该函数没有返回值。voidOnStart(){inta=123;doubleb=1.23;charc='a';string d="abc";color e=clrDarkViolet;// 颜色也可以定义为C'R,G,B',取值范围为0-255datetime f=D'2025.02.16 05:05';// 等同 datetime f = D'2025.02.16 05:05:00';// 如果写 datetime f = D'2025.02.16'; 等同 datetime f = D'2025.02.16 00:00:00';}2、常量(1)标准常量系统自带的的常量。voidOnStart(){intx=PERIOD_M15;// PERIOD_M15为标准常量}(2)自定义常量#definechangliang"abc"voidOnStart(){string s=changliang;}3、变量(1)预定义变量每个预定义变量都对应一个函数,以后编程时,可以直接使用该函数,来代替预定义变量。voidOnStart(){intf=_Digits;// 预定义变量intg=Digits();}

相关新闻

最新新闻

Matplotlib面向对象绘图核心原理与学术图表实战

Matplotlib面向对象绘图核心原理与学术图表实战

1. 这不是“画图教程”,而是一份能让你少踩三年坑的 Matplotlib 实战手记Matplotlib 不是 Python 里一个用来“加个图表”的装饰性库,它是整个科学计算生态的视觉神经中枢。从 Pandas 的.plot()背后,到 Scikit-learn 的classification_report…

2026/7/6 21:45:55
Linux Mint 21.3 安装引导 2 大疑难:GRUB 误入与花屏的 4 种应对策略

Linux Mint 21.3 安装引导 2 大疑难:GRUB 误入与花屏的 4 种应对策略

Linux Mint 21.3 安装引导疑难全攻略:从GRUB误入到花屏的终极解决方案当你准备从Windows或Ubuntu迁移到Linux Mint时,安装引导阶段往往会成为第一个"拦路虎"。特别是对于配备NVIDIA显卡的设备,GRUB误入和花屏问题几乎成了必经之路。…

2026/7/6 21:45:55
关于动态规划【力扣392.判断子序列的思考】

关于动态规划【力扣392.判断子序列的思考】

1、目前动态规划的子序列系列的题目之间的区别与联系【力扣300.最长递增子序列】一个数组,不连续【力扣674.最长连续递增子序列】一个数组,连续【力扣718.最长重复子数组】两个数组,连续【力扣1143.最长公共子序列】两个数组,不连…

2026/7/6 21:45:55
庄小焱——博主个人介绍

庄小焱——博主个人介绍

1. 个人介绍 我是庄小焱。职于国内某里互联网大厂,通过基金从业人员考试、PMP项目管理专家、系统架构设计师(高级)、CSDN博文专家、2025年CSDN博客之星(前100),2024年CSDN博客之星(前200)。 博主在支付交易…

2026/7/6 21:45:55
英雄联盟Akari助手:终极免费自动化工具完整使用指南,快速提升游戏效率

英雄联盟Akari助手:终极免费自动化工具完整使用指南,快速提升游戏效率

英雄联盟Akari助手:终极免费自动化工具完整使用指南,快速提升游戏效率 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit …

2026/7/6 21:45:55
STC3115与PIC18LF46K22在电池管理系统中的设计与优化

STC3115与PIC18LF46K22在电池管理系统中的设计与优化

1. STC3115电池监控芯片的核心特性解析STC3115是STMicroelectronics推出的一款专为单节锂离子/聚合物电池设计的燃料计量芯片。这款芯片在嵌入式系统领域已经建立了良好的口碑,特别是在需要精确电池管理的应用中。它的核心价值在于能够实时监测电池的电压、电流、温…

2026/7/6 21:40:55

月新闻