文章 "MQL5 Cookbook: 开发多品种指标分析价格偏离"

 

新文章 MQL5 Cookbook: 开发多品种指标分析价格偏离已发布:

在本篇中, 我们将研究开发一款多品种指标来分析指定时间周期内的价格偏离。其核心议题已经在之前的多货币对指标编程文章中进行过讨论 "MQL5 Cookbook: 用 MQL5 开发多品种波动指标"。所以这次,我们将仅关注那些有了大幅变化的新特征和功能。如果您是多货币对指标编程的新人, 我建议您先去阅读之前的文章。

周线时间帧 "垂直线" 模式

在本篇中我们将研究以下问题:

  • 改变图表属性。
  • 处理 CHARTEVENT_OBJECT_DRAG(拖拽图表对象)以及 CHARTEVENT_CHART_CHANGE (使用属性对话框缩放图表或修改图表属性) 事件。
  • 使用多种颜色渲染指标缓存区。
  • 在指标缓存区的可视区域内定义最高和最低,来设置图表的最高/最低。
  • 序列翻转。

作者:Anatoli Kazharski

 

是打错了还是应该是这样?

无论我试了多少次,"复制小组 "的所有函数都不会返回 0,只会返回-1 或 >0。

//+------------------------------------------------------------------+
//| 检查所有字符的可用数据数
//+------------------------------------------------------------------+
bool CheckAvailableData()
  {
   int attempts=100;
   
//---
   for(int s=0; s<SYMBOLS_COUNT; s++)
     {
      //--- 如果有这样一个字符
      if(symbol_names[s]!=empty_symbol)
        {
datetime time[];                    // 检查条数的数组
   int      total_period_bars   =0;    // 当前时段的条数
   datetime terminal_first_date =NULL; // 终端中当前时段可用数据的第一个日期
         //--- 获取终端中当前时段数据的第一个日期
         terminal_first_date=(datetime)SeriesInfoInteger(symbol_names[s],Period(),SERIES_TERMINAL_FIRSTDATE);
         //--- 获取从指定日期开始的可用条数
         total_period_bars=Bars(symbol_names[s],Period(),terminal_first_date,TimeCurrent());
         //--- 检查这些条形图是否准备就绪
         for(int i=0; i<attempts; i++)
           {
            //--- 复制指定数量的数据
            if(CopyTime(symbol_names[s],Period(),0,total_period_bars,time))
              {
               //--- 如果复制了所需数量,则停止循环
               if(ArraySize(time)>=total_period_bars)
                  break;
              }
           }
         //--- 如果复制的数据较少,则必须再次尝试。
         if(ArraySize(time)==0 || ArraySize(time)<total_period_bars)
           {
            msg_last=msg_prepare_data;
            ShowCanvasMessage(msg_prepare_data);
            OC_prev_calculated=0;
            return(false);
           }
        }
     }
//--- 如果价格差的起点处于垂直线模式,则退出
   if(StartPriceDivergence==VERTICAL_LINE)
      return(true);
   else
     {
      datetime time[];                    // 检查条数的数组
      int      total_period_bars   =0;    // 当前时段的条数
      datetime terminal_first_date =NULL; // 终端中当前时段可用数据的第一个日期
      //--- 获取终端中当前时段数据的第一个日期
      for(int i=0; i<attempts; i++)
         if((terminal_first_date=(datetime)SeriesInfoInteger(Symbol(),Period(),SERIES_FIRSTDATE))>0)
            break;
      //--- 获取从指定日期开始的可用条数
      for(int i=0; i<attempts; i++)
         if((total_period_bars=(int)SeriesInfoInteger(Symbol(),timeframe_start_point,SERIES_BARS_COUNT))>0)
            break;
      //--- 检查这些条形图是否准备就绪
      for(int i=0; i<attempts; i++)
         //--- 复制指定数量的数据
         if(CopyTime(Symbol(),timeframe_start_point,
            terminal_first_date+PeriodSeconds(timeframe_start_point),TimeCurrent(),time)>0)
            break;
      //--- 如果复制的数据较少,则必须再次尝试。
      if(ArraySize(time)<=0 || total_period_bars<=0)
        {
         msg_last=msg_prepare_data;
         ShowCanvasMessage(msg_prepare_data);
         OC_prev_calculated=0;
         return(false);
        }
     }
//---
   return(true);
  }
 
Fleder:

是打错了还是应该是这样?

不管我试了多少次,"复制小组 "的所有函数都不会返回 0,只会返回-1 或 >0。

但在这种情况下,后续检查允许你不这样做。
 
tol64:
但在本例,后续检查允许您不这样做。

但这个表达式永远为真:

if(CopyTime(symbol_names[s],Period(),0,total_period_bars,time))
 
Fleder:

但这个表达式永远为真:

您完全可以去掉if。在这种情况下,它并不重要。
 
tol64:
您可以删除 "如果"。在这种情况下,它并不重要。
嗯,我也是这么想的 :-)
 

一般来说,加载符号的历史数据并不是按照帮助文件 中的方式进行的。

事实上,情况是这样的

如果 mql5 程序请求使用 CopyTime 等函数获取某个时间序列的数据,而终端中没有该数据(尚未加载),则终端会下载该数据。

而该数据不在终端中(尚未加载),终端将从服务器下载该数据,但下载量不会达到所请求的数量(在帮助示例中为 100 条)、

而是按照参数 "图表中的最大条数 "允许在 RAM 中 "放置 "的所需时间序列的条数。

只需请求较高周期(如 PERIOD_W1) 的一个条形图,即可从服务器下载整个历史数据。

 
Fleder:

一般来说,加载符号的历史数据并不是按照帮助文件 中的方式进行的。

事实上,情况是这样的

如果 mql5 程序请求使用 CopyTime 等函数获取某个时间序列的数据,而终端中没有该数据(尚未加载),则终端会下载该数据。

而该数据不在终端中(尚未加载),终端将从服务器下载该数据,但下载量不会达到所请求的数量(在帮助示例中为 100 条)、

而是按照参数 "图表中的最大条数 "允许在 RAM 中 "放置 "的所需时间序列的条数。

只需请求较高周期(如 PERIOD_W1) 的一个条形图即可,因为整个历史记录都将从服务器下载。

帮助中可以提供任何您想要的信息。您可以自由发挥。;)

帮助中的示例在另一篇文章中讨论过:如何为其他程序准备 MetaTrader 5 报价 >>>。

 
tol64:

证书上可以写任何你想写的内容。你可以自由发挥。;)

帮助中的例子在另一篇文章中讨论过:如何为其他程序准备 MetaTrader 5 报价 >>。

我就是这么做的。我只是看到了您代码中对服务器剩余 "未加载条数 "的计算。

我想--终端并不关心,它需要多少就输出多少。

 

在文章的结尾,您写道:"这个指标可以无限地发展得更好"。

在我看来,对价格背离的思考对人眼来说用处不大。人不是机器人!

但对于机器人来说,这是一个有趣的话题。

您提出了几种渲染方案:

1. 从线上看。

2.2. "日"。

我目前正在做类似的工作,只是在 "周 "模式下。

 
Fleder:

在文章的结尾,您写道:"这个指标可以无限地发展得更好"。

在我看来,对价格背离的思考对人眼来说用处不大。人不是机器人!

但对于机器人来说,这是一个有趣的话题。

您提出了几种渲染方案:

1. 从线上看。

2.2. "日"。

我目前也在做类似的工作,只是在 "星期 "模式下。

我不确定是否能很快写出其他东西,因为我还在处理其他问题。但根据这篇文章,开发工作应该还是在多币种计算以及在画布上实现这些计算的可视化方面。

是的,人不是机器人,但有时你需要通过其他方式来了解研究课题。;)