MQL5教程 02 标准语法
2026/7/6 20:30:40 网站建设 项目流程

文章目录

  • 一、事件处理函数
    • 1、OnInit / OnDeinit / OnTick
    • 2、OnTimer
    • 3、OnTrade / OnTradeTransaction
    • 4、OnChartEvent
    • 5、OnTester
    • 6、OnTesterInit / OnTesterPass / OnTesterDeinit
    • 7、OnBookEvent
    • 8、OnCalculate
    • 9、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 / OnTick

OnInit:当指标或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 / OnTradeTransaction

OnTrade:对即时交易或者挂单进行开仓、平仓、修改订单,都执行该函数。由于该函数难以把控,一般不使用。
OnTradeTransaction:事件触发条件同 OnTrade,但由于丰富的形参可以更精准地定位需求,所以常使用该函数。

intOnInit(){printf("init");return(INIT_SUCCEEDED);}voidOnDeinit(constintreason){printf("deinit");}voidOnTick(){}voidOnTradeTransaction(constMqlTradeTransaction&trans,constMqlTradeRequest&request,constMqlTradeResult&result){if(trans.type==TRADE_TRANSACTION_REQUEST)// trans.type == TRADE_TRANSACTION_REQUEST: 服务器收到了交易请求,准备开始处理,此时还未真正开仓。// 如果要确定多单已经真正做进去(成交)了,需要监听 TRADE_TRANSACTION_DEAL_ADD(即交易记录写入了账户历史)。{if(request.action==TRADE_ACTION_DEAL&&request.type==ORDER_TYPE_BUY)// TRADE_ACTION_DEAL 即时交易// ORDER_TYPE_BUY 订单类型是买单 注:空单平仓视为开多单{Alert("你已经开多单");}}}

4、OnChartEvent

OnChartEvent:当在图表上进行一些操作时,触发事件,执行该回调函数。

intOnInit(){printf("init");return(INIT_SUCCEEDED);}voidOnDeinit(constintreason){printf("deinit");}voidOnTick(){}voidOnChartEvent(constintid,constlong&lparam,constdouble&dparam,conststring&sparam){if(id==CHARTEVENT_CLICK){Alert("你单击了鼠标"+"x:"+lparam+"y:"+dparam);}}

5、OnTester

OnTester:在EA交易测试历史数据完毕后,执行该函数。

核心作用是自定义一个“打分指标”(优化标准)。 比如,不想单纯以“利润最大”来选参数,而是想以“利润 / 最大回撤”的比值来选参数,就可以用它。

OnTester的返回值是 double 类型。这个返回值的作用是在优化选择最大定制,在结果中进行排名。


inputinti=10;intOnInit(){printf("init");return(INIT_SUCCEEDED);}voidOnDeinit(constintreason){printf("deinit");}voidOnTick(){}doubleOnTester(){printf("执行完了!");// 这句代码并不会在“专家”选项卡中显示,而是需要“优化结果”选项卡中任意双击一行,// 然后在其右边的“日志”选项卡中显示。return(11.0);}

6、OnTesterInit / OnTesterPass / OnTesterDeinit

EA优化时,触发这些函数。
详细说明,暂略。

7、OnBookEvent

OnBookEvent:在市场深度变化时触发。在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(conststring&symbol){printf(symbol+"这个货币市场深度发生了变化");}

8、OnCalculate

OnCalculate:指标专有的事件处理函数,每个新的 tick 到来,触发一次该函数。

intOnInit(){return(INIT_SUCCEEDED);// 返回 INIT_SUCCEEDED,才能执行 OnCalculate 函数。}intOnCalculate(constintrates_total,// 当前图表中加载的全部历史 K 线总数constintprev_calculated,// 之前计算过的 K 线数constdatetime&time[],constdouble&open[],constdouble&high[],constdouble&low[],constdouble&close[],constlong&tick_volume[],constlong&volume[],constint&spread[]){printf(open[1]);return(rates_total);// OnCalculate 函数的返回值会赋值给变量 prev_calculated,// 下次再触发 OnCalculate 函数时,prev_calculated就会得到上一次的 OnCalculate 函数返回值。}

9、OnStart

OnStart:脚本专有的事件处理函数,加载脚本后,只执行一次。

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();}

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询