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

量化交易之MQL4篇 - 自定义指标基础

| 发表于 2022-12-5 14:03:52 | 显示全部楼层 |复制链接
  1. //+------------------------------------------------------------------+
  2. //|                                                          foo.mq4 |
  3. //|                                      Copyright 2018, Tang Qizhe. |
  4. //|                                            https://www.baidu.com |
  5. //+------------------------------------------------------------------+
  6. #property copyright "Copyright 2018, Tang Qizhe."
  7. #property link      "https://www.baidu.com"
  8. #property version   "1.00"
  9. #property strict
  10. #property indicator_chart_window
  11. #property indicator_buffers 4
  12. #property indicator_plots   4
  13. //--- plot shortPeriodLine
  14. const string shortPeriodLine = "shortPeriodLine";
  15. #property indicator_label1  "shortPeriodLine"
  16. #property indicator_type1   DRAW_LINE
  17. #property indicator_color1  clrRed
  18. #property indicator_style1  STYLE_SOLID
  19. #property indicator_width1  1
  20. double shortPeriodLineBuffer[];
  21. //--- plot longPeriodLine
  22. const string longPeriodLine = "longPeriodLine";
  23. #property indicator_label2  "longPeriodLine"
  24. #property indicator_type2   DRAW_LINE
  25. #property indicator_color2  clrWhite
  26. #property indicator_style2  STYLE_SOLID
  27. #property indicator_width2  1
  28. double longPeriodLineBuffer[];
  29. //--- plot buyArrow
  30. const string buyArrow = "buyArrow";
  31. #property indicator_label3  "buyArrow"
  32. #property indicator_type3   DRAW_ARROW;
  33. #property indicator_color3  clrRed
  34. #property indicator_style3  STYLE_SOLID
  35. #property indicator_width3  1
  36. double buyArrowBuffer[];
  37. //--- plot sellArrow
  38. const string sellArrow = "sellArrow";
  39. #property indicator_label4  "sellArrow"
  40. #property indicator_type4   DRAW_ARROW
  41. #property indicator_color4  clrLime
  42. #property indicator_style4  STYLE_SOLID
  43. #property indicator_width4  1
  44. double sellArrowBuffer[];
  45. //--- input parameters
  46. input int shortPeriodDay = 10;
  47. input int longPeriodDay = 20;
  48. int OnInit() {
  49.     // 设置buffer数组与指标的一一对应关系
  50.     SetIndexBuffer(0,shortPeriodLineBuffer);
  51.     SetIndexBuffer(1,longPeriodLineBuffer);
  52.     SetIndexBuffer(2,buyArrowBuffer);
  53.     SetIndexBuffer(3,sellArrowBuffer);
  54.     // 设置箭头类型(225、226为箭头的类型)
  55.     SetIndexArrow(2, 225);
  56.     SetIndexArrow(3, 226);
  57.     /** 指标准备工作的另一种形式
  58.     SetIndexBuffer(0,shortPeriodLineBuffer);
  59.     SetIndexLabel(0, "shortPeriodLine");
  60.     SetIndexStyle(0, DRAW_LINE, STYLE_SOLID, 1, clrRed);
  61.     */
  62.     return(INIT_SUCCEEDED);
  63. }
  64. int OnCalculate(const int rates_total,
  65.                 const int prev_calculated,
  66.                 const datetime &time[],
  67.                 const double &open[],
  68.                 const double &high[],
  69.                 const double &low[],
  70.                 const double &close[],
  71.                 const long &tick_volume[],
  72.                 const long &volume[],
  73.                 const int &spread[]) {
  74.     // 异常处理:如果当前k线数目过少, 则不执行之后的代码
  75.    if(rates_total < MathMax(shortPeriodDay, longPeriodDay)) return 0;
  76.    // 优化程序的执行效率:只操作之前没操作过的k线.(limit: 需要跟新的k线个数)
  77.    int limit = rates_total - prev_calculated;
  78.     // 最后一根k线有新的价格来时, 仅刷新最后一根k线
  79.    if(limit == 0) limit++;
  80.    // 根据系统自带指标MA, 画两条线
  81.    for(int i = 0; i < limit; i++) {
  82.       shortPeriodLineBuffer = iMA(Symbol(), PERIOD_CURRENT, shortPeriodDay, 0, MODE_SMA, PRICE_CLOSE, i);
  83.       longPeriodLineBuffer = iMA(Symbol(), PERIOD_CURRENT, longPeriodDay, 0, MODE_SMA, PRICE_CLOSE, i);
  84.    }
  85.    // 在两条线的交叉处画箭头
  86.    for(int i = 0; i < limit; i++) {
  87.       if(shortPeriodLineBuffer > longPeriodLineBuffer && shortPeriodLineBuffer[i+1] < longPeriodLineBuffer[i+1]) {
  88.          buyArrowBuffer = shortPeriodLineBuffer;
  89.   } else if(shortPeriodLineBuffer<longPeriodLineBuffer && shortPeriodLineBuffer[i+1]>longPeriodLineBuffer[i+1]) {
  90.          sellArrowBuffer = longPeriodLineBuffer;
  91.       }
  92.    }
  93.    return(rates_total);
  94. }
复制代码
如果有帮助,就支持一下我呗
举报

评论 使用道具

精彩评论2

limitover
D
| 发表于 2022-12-5 15:03:18 | 显示全部楼层
谢谢分享
举报

点赞 评论 使用道具

Mike
D
| 发表于 2022-12-6 16:58:18 | 显示全部楼层
啊,看不懂,哈哈哈哈
举报

点赞 评论 使用道具

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

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