新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 1161

 
KolyanSNA:
你好!我如何在终端改变字体大小?谁能给我一个提示?

如果你有这样的需要,改变操作系统显示设置中的缩放可能会有帮助。

 

有没有办法从OnChartEvent 中确定当鼠标点击图形时,键盘上的按钮是否被按下?

 

请帮助我理解这些指标。

在这里,在每个新条形 的开口处,应该有一个重新计算。

逻辑--ZigZag应该连接底部(过去3个柱子的低点低于相邻的两个柱子)和顶部(过去3个柱子的高点高于相邻的两个柱子)。

如果一个高峰之后又出现了新的高峰,指标就会在新的高峰上重新绘制,旧的高峰就会被删除,我想这很清楚。

事实上,该指标将所有的高点和低点按顺序连接起来,问题出在哪里?

#property indicator_chart_window
#property indicator_buffers 2 
#property indicator_plots   1 
//--- plot ZigZag 
#property indicator_label1  "ZigZag" 
#property indicator_type1   DRAW_ZIGZAG 
#property indicator_color1  clrBlue 
#property indicator_style1  STYLE_SOLID 
#property indicator_width1  1 
//--- indicator buffers 
double         ZigZagBuffer1[]; 
double         ZigZagBuffer2[]; 
double a = 0;
int last = 0; //В последний раз была вершина или низина 
int lastN = 0; //Номер бара с экстремумом
//+------------------------------------------------------------------+ 
//| Custom indicator initialization function                         | 
//+------------------------------------------------------------------+ 
int OnInit() 
  { 
//--- связывание массивов и индикаторных буферов 
   SetIndexBuffer(0,ZigZagBuffer1,INDICATOR_DATA); 
   SetIndexBuffer(1,ZigZagBuffer2,INDICATOR_DATA); 
//--- значение 0 (пустое значение) не будет участвовать в отрисовке 
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0); 
   ArrayInitialize(ZigZagBuffer1, EMPTY_VALUE);
   ArrayInitialize(ZigZagBuffer2, EMPTY_VALUE);
//--- значение 0 (пустое значение) не будет участвовать в отрисовке 
   PlotIndexSetString(0,PLOT_LABEL,"ZigZag1;ZigZag2"); 
//--- 
   return(INIT_SUCCEEDED); 
  } 
//+------------------------------------------------------------------+ 
//| Custom indicator iteration function                              | 
//+------------------------------------------------------------------+ 
int OnCalculate(const int rates_total, 
                const int prev_calculated, 
                const datetime &time[], 
                const double &open[], 
                const double &high[], 
                const double &low[], 
                const double &close[], 
                const long &tick_volume[], 
                const long &volume[], 
                const int &spread[]) 
{ 
   if(a != iOpen(_Symbol, PERIOD_CURRENT, 0))
   {
      a = iOpen(_Symbol, PERIOD_CURRENT, 0);
      for(int i = Bars(_Symbol, PERIOD_CURRENT) - 3; i > 0; i--)
      {
         if(high[i] <= high[i+1] && high[i+2] <= high[i+1] && low[i] >= low[i+1] && low[i+2] >= low[i+1]) //В обе стороны на одном баре
         {
            if(last == 0) continue; //Если с этого начинается расчет - пропускаем просто
            if(last == 1) //Если была вершина
            {
               if(high[lastN] > high[i+1])//Если новая верщина не перебила старую
               {
                  ZigZagBuffer1[i+1] = high[i+1];
                  ZigZagBuffer2[i+1] = low[i+1];
                  lastN = i+1;
                  continue;
               }
               //Если перебила
               ZigZagBuffer1[lastN] = EMPTY_VALUE;
               ZigZagBuffer1[i+1] = high[i+1];
               ZigZagBuffer2[i+1] = low[i+1];
               last = -1;
               lastN = i+1;
               continue;
            }
            if(last == -1)
            {
               if(low[lastN] < low[i+1])//Если новая низина не перебила старую
               {
                  ZigZagBuffer1[i+1] = high[i+1];
                  ZigZagBuffer2[i+1] = low[i+1];
                  lastN = i+1;
                  continue;
               }
               //Если перебила
               ZigZagBuffer2[lastN] = EMPTY_VALUE;
               ZigZagBuffer1[i+1] = high[i+1];
               ZigZagBuffer2[i+1] = low[i+1];
               last = 1;
               lastN = i+1;
               continue;
            }
         }
         if(high[i] <= high[i+1] && high[i+2] <= high[i+1]) //Новая вершина
         {
            if(last == 0)
            {
               last = 1;
               lastN = i+1;
               ZigZagBuffer1[i+1] = high[i+1];
               continue;
            }
            if(last == 1)
            {
               ZigZagBuffer1[lastN] = EMPTY_VALUE;
               ZigZagBuffer1[i+1] = high[i+1];
               lastN = i+1;
               continue;
            }
            if(last == -1)
            {
               ZigZagBuffer1[i+1] = high[i+1];
               lastN = i+1;
               last = 1;
               continue;
            }
         }
         if(low[i] >= low[i+1] && low[i+2] >= low[i+1])//Новая низина
         {
            if(last == 0)
            {
               last = -1;
               lastN = i+1;
               ZigZagBuffer2[i+1] = low[i+1];
               continue;
            }
            if(last == -1)
            {
               ZigZagBuffer2[lastN] = EMPTY_VALUE;
               ZigZagBuffer2[i+1] = low[i+1];
               lastN = i+1;
               continue;
            }
            if(last == 1)
            {
               ZigZagBuffer2[i+1] = low[i+1];
               lastN = i+1;
               last = -1;
               continue;
            }
         }
      }
   }
   
   return(rates_total); 
} 
Обработчик события "новый бар"
Обработчик события "новый бар"
  • www.mql5.com
Для создателей индикаторов и экспертов всегда был актуален вопрос написания экономичного кода с точки зрения времени выполнения. Можно подойти к решению этой задачи с разных сторон. Из этой обширной темы в данной статье будет затронут, казалось бы уже решенный вопрос: проверка появления нового бара. Это достаточно популярный способ ограничения...
 
Roman Sharanov:

请帮助我理解这些指标。

在这里,在每个新条形 的开口处,应该有一个重新计算。

逻辑--ZigZag应该连接底部(过去3个柱子的低点低于相邻的两个柱子)和顶部(过去3个柱子的高点高于相邻的两个柱子)。

如果一个高峰之后又出现了新的高峰,指标就会在新的高峰上重新绘制,旧的高峰就会被删除,我想这很清楚。

事实上,指标将所有HI和LH串联起来,问题出在哪里?

据我所知,你有2个绘图缓冲区。这两个人都被抽中了。每个缓冲区都有自己的线,你得到一个极值。在 "之 "字形中,有3个缓冲区。两个计算出来的分别是最大值和最小值,还有一个是根据符号画出来的,在最大值被写入缓冲区后,我们要寻找最小值,反之亦然。

 
问题,到底有没有关于 MT4的标准库 的描述?
 
Valeriy Yastremskiy:

我知道你有两个绘图缓冲区。两者都被抽中。每个缓冲区都有自己的线,你得到一个极端。在 "之 "字形中,有3个缓冲区。两个计算缓冲区分别用于最大值和最小值,一个缓冲区用于在写进最大值缓冲区的最后一个最大值之后绘图,反之亦然。

帮助--Zigzag是用2个缓冲区建立的,例子中也有2个缓冲区

 
Valeriy Yastremskiy:
问题,到底有没有关于 MT4的标准库 的描述?
Документация по MQL5: Стандартная библиотека
Документация по MQL5: Стандартная библиотека
  • www.mql5.com
Стандартная библиотека MQL5 написана на языке MQL5 и предназначена для облегчения написания программ (индикаторов, скриптов, экспертов) конечным пользователям. Библиотека обеспечивает удобный доступ к большинству внутренних функций MQL5.
 
Artyom Trishkin:

MT4。

为这些文章点赞。伟大的工作。

 
Roman Sharanov:

帮助--人字形建立在2个缓冲区上,也有2个缓冲区的例子

ZZ代码的开始。

//+------------------------------------------------------------------+
//|                                                       ZigZag.mq4 |
//|                   Copyright 2006-2014, MetaQuotes Software Corp. |
//|                                              http://www.mql4.com |
//+------------------------------------------------------------------+
#property copyright "2006-2014, MetaQuotes Software Corp."
#property link      "http://www.mql4.com"
#property strict

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1  Red
//---- indicator parameters
input int InpDepth=12;     // Depth
input int InpDeviation=5;  // Deviation
input int InpBackstep=3;   // Backstep
//---- indicator buffers
double ExtZigzagBuffer[];
double ExtHighBuffer[];
double ExtLowBuffer[];

一个绘图缓冲区。三个数组。

看一下代码。这个逻辑很复杂。这通常是很难做到的事。

带有俄文翻译注释的ZigZag代码
附加的文件:
ZigZagRu.mq4  19 kb
 
Valeriy Yastremskiy:

MT4。

为这些文章点赞。伟大的工作。

无所谓--几乎所有东西都适合。

谢谢你。

原因: