设为首页 收藏本站 切换语言

量化交易之MQL4篇-MQL4基本框架函数及基础的事件交互功能

| 发表于 2022-12-3 11:37:06 | 显示全部楼层 |复制链接
  1. // EA初始化、切换品种的时候运行一次
  2. int OnInit() {
  3.     // 设置定时器, 每 2 秒执行一次OnTimer()
  4.     // EventSetTimer(5);
  5.     // 下面两句代码会开启对象的创建和删除的交互功能
  6.     //--- enable object create events
  7.     ChartSetInteger(ChartID(),CHART_EVENT_OBJECT_CREATE,true);
  8.     //--- enable object delete events
  9.     ChartSetInteger(ChartID(),CHART_EVENT_OBJECT_DELETE,true);
  10.     Print("OnInit");
  11.     return INIT_SUCCEEDED;
  12. }
  13. void OnTimer() {
  14.    Print(TimeLocal());
  15.    return;
  16. }
  17. #define KEY_LEFT 37
  18. #define KEY_UP 38
  19. #define KEY_RIGHT 39
  20. #define KEY_DOWN 40
  21. void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam) {
  22.    // 判断当前事件的类型
  23.    if(id == CHARTEVENT_KEYDOWN) {
  24.       // click left button of keyboard
  25.       if(lparam == KEY_LEFT) {
  26.          changeToLeftPeriod();
  27.       } else if(lparam == KEY_RIGHT) {
  28.          changeToRightPeriod();
  29.       }
  30.    }
  31.    if(id == CHARTEVENT_CLICK) {
  32.       Print("The coordinates of the mouse click on the chart are: x = ", lparam, "   y = ", dparam);
  33.    }
  34.    if(id == CHARTEVENT_OBJECT_CLICK) {
  35.       Print("The mouse has been clicked on the object with name '", sparam,"'");
  36.    }
  37.    if(id == CHARTEVENT_OBJECT_DELETE) {
  38.       Print("the object with name '", sparam, "' has been deleted");
  39.    }
  40.    if(id == CHARTEVENT_OBJECT_CREATE) {
  41.       Print("the object with name '", sparam, "' has been created");
  42.    }
  43.    if(id == CHARTEVENT_OBJECT_DRAG) {
  44.       Print("the object with name '", sparam, "' has been draged");
  45.    }
  46.    if(id == CHARTEVENT_OBJECT_ENDEDIT) {
  47.       Print("the object with name '", sparam, "' has been edited");
  48.    }
  49. }
  50. void changeToLeftPeriod() {
  51.    ENUM_TIMEFRAMES nowPeriod = PERIOD_CURRENT;
  52.    // set period at now
  53.    switch(Period()) {
  54.       case PERIOD_M1: {
  55.          nowPeriod = PERIOD_MN1;
  56.          break;
  57.       }
  58.       case PERIOD_M5: {
  59.          nowPeriod = PERIOD_M1;
  60.          break;
  61.       }
  62.       case PERIOD_M15: {
  63.          nowPeriod = PERIOD_M5;
  64.          break;
  65.       }
  66.       case PERIOD_M30: {
  67.          nowPeriod = PERIOD_M15;
  68.          break;
  69.       }
  70.       case PERIOD_H1: {
  71.          nowPeriod = PERIOD_M30;
  72.          break;
  73.       }      
  74.       case PERIOD_H4: {
  75.          nowPeriod = PERIOD_H1;
  76.          break;
  77.       }
  78.       case PERIOD_D1: {
  79.          nowPeriod = PERIOD_H4;
  80.          break;
  81.       }
  82.       case PERIOD_W1: {
  83.          nowPeriod = PERIOD_D1;
  84.          break;
  85.       }
  86.       case PERIOD_MN1: {
  87.          nowPeriod = PERIOD_W1;
  88.          break;
  89.       }
  90.       default: break;
  91.    }
  92.    // change period
  93.    if(nowPeriod != PERIOD_CURRENT) {
  94.       ChartSetSymbolPeriod(0, Symbol(), nowPeriod);
  95.    }
  96. }
  97. void changeToRightPeriod() {
  98.    ENUM_TIMEFRAMES nowPeriod = PERIOD_CURRENT;
  99.    // set period at now
  100.    switch(Period()) {
  101.       case PERIOD_M1: {
  102.          nowPeriod = PERIOD_M5;
  103.          break;
  104.       }
  105.       case PERIOD_M5: {
  106.          nowPeriod = PERIOD_M15;
  107.          break;
  108.       }
  109.       case PERIOD_M15: {
  110.          nowPeriod = PERIOD_M30;
  111.          break;
  112.       }
  113.       case PERIOD_M30: {
  114.          nowPeriod = PERIOD_H1;
  115.          break;
  116.       }
  117.       case PERIOD_H1: {
  118.          nowPeriod = PERIOD_H4;
  119.          break;
  120.       }      
  121.       case PERIOD_H4: {
  122.          nowPeriod = PERIOD_D1;
  123.          break;
  124.       }
  125.       case PERIOD_D1: {
  126.          nowPeriod = PERIOD_W1;
  127.          break;
  128.       }
  129.       case PERIOD_W1: {
  130.          nowPeriod = PERIOD_MN1;
  131.          break;
  132.       }
  133.       case PERIOD_MN1: {
  134.          nowPeriod = PERIOD_M1;
  135.          break;
  136.       }
  137.       default: break;
  138.    }
  139.    // change period
  140.    if(nowPeriod != PERIOD_CURRENT) {
  141.       ChartSetSymbolPeriod(0, Symbol(), nowPeriod);
  142.    }
  143. }
  144. // 盘面改变品种、切换时间周期、修改EA参数、关闭品种的盘面的时候会触发这个函数
  145. void OnDeinit(const int reason) {
  146.     //--- The first way to get the uninitialization reason code
  147.     //Print(__FUNCTION__,"_Uninitalization reason code = ",reason);
  148.     //--- The second way to get the uninitialization reason code
  149.     Print(__FUNCTION__, "_UninitReason = ", getUninitReasonText(_UninitReason));
  150.     return;
  151. }
  152. // get reason text
  153. string getUninitReasonText(int reasonCode) {
  154.     string text="";
  155.     switch(reasonCode) {
  156.       case REASON_ACCOUNT:{
  157.          text="Account was changed";
  158.          break;
  159.       }
  160.       case REASON_CHARTCHANGE: {
  161.          text="Symbol or timeframe was changed";
  162.          break;
  163.       }
  164.       case REASON_CHARTCLOSE:{
  165.          text="Chart was closed";
  166.          break;
  167.       }
  168.       case REASON_PARAMETERS:{
  169.          text="Input-parameter was changed";
  170.          break;
  171.       }
  172.       case REASON_RECOMPILE:{
  173.          text="Program "+__FILE__+" was recompiled";
  174.          break;
  175.       }
  176.       case REASON_REMOVE:{
  177.          text="Program "+__FILE__+" was removed from chart";
  178.          break;
  179.       }
  180.       case REASON_TEMPLATE:{
  181.          text="New template was applied to chart";
  182.          break;
  183.       }
  184.       default:{
  185.          text="Another reason";  
  186.       }
  187.      }
  188.     return text;
  189. }
复制代码
如果有帮助,就支持一下我呗
举报

评论 使用道具

精彩评论2

qwe11
CCC
| 发表于 2022-12-4 08:06:14 | 显示全部楼层
交互功能
举报

点赞 评论 使用道具

daerwushen
DD
| 发表于 2022-12-4 14:07:35 | 显示全部楼层
学习交互功能
举报

点赞 评论 使用道具

发新帖
EA交易
您需要登录后才可以评论 登录 | 立即注册

简体中文
繁體中文
English(英语)
日本語(日语)
Deutsch(德语)
Русский язык(俄语)
بالعربية(阿拉伯语)
Türkçe(土耳其语)
Português(葡萄牙语)
ภาษาไทย(泰国语)
한어(朝鲜语/韩语)
Français(法语)