
文章目录一、事件处理函数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();}