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

 
Igor Makanu:

你没有在开头或其他地方初始化它们,你只是声明了它们

我在使用前写道,即如果你有变量SredRazmax、SredRazmin、Sredn作为数组值的总和,那么为了正确计算总和,你需要将变量归零,然后将数组值相加并保存在该变量中

第二,你有一个问题,在指标中,每一个刻度都 会调用OnCalculate() ,这意味着你将在每一个刻度上不断地计算ZigZag的顶部,即大约每秒40-60次

谢谢,但我试着把它们归零,并试着OnStart 代替OnCalculate() 数值仍然在跳动,我不清楚如果ww=0(数组值总是显示),为什么数值会在中间跳动,如何让它不计算每个刻度,只计算数组的数值?

 
Dmitry Belov:

谢谢,但我已经尝试将它们归零,并尝试使用OnStart 而不是OnCalculate( )。

我想我无法解释为什么会这样,问题是OnStart()用于脚本,而OnCalculate()用于指标。 你应该了解MQL中脚本和指标的区别。

我不太清楚你的任务是什么?在代码中,你把整个图表上ZigZag峰值所在的价格加起来,在输出中你写上 "平均价差 "并打印数值(SredRazmax-SredRazmin)/nn,并且对所有条形进行计算

如果你不使用指标缓冲区 来绘图,为什么需要指标?

 
Igor Makanu:

我想我无法解释为什么会发生这种情况,关键是OnStart()在脚本中使用,而OnCalculate()在指标中使用,你需要了解脚本与MQL中的指标有何不同。

我不太清楚你的任务是什么?在代码中,你把整个图表上ZigZag峰值所在的价格加起来,在输出中你写上 "平均价差 "并打印数值(SredRazmax-SredRazmin)/nn,并且对所有条形进行计算

如果你不使用指标缓冲区 来绘图,为什么需要一个指标? 在指标中,缓冲区被附加到条形图上,一旦有新的条形图出现,它们的值就会移动。

说实话,我简化了这个问题(原始公式看起来有点不同),我想我能够理解为什么当数组中的零值保持不变时,平均数的数值会跳动。我有两个循环,一个用于填充数组,另一个用于计算平均数,有一个nn的限制,实际上我想输出一个图形--这是一个标准的之字形,但iCustom在画地狱,平均...从零节点开始,如果它比前一个节点大,就减去前一个节点,从前一个节点减去前一个节点(它将是减号,所以应该乘以减1),所有这些应该相加并除以给定数量的nn。我们得到顶点的平均跨度。进一步说,我想得到 "之 "字形的其他平均数,但我被 "跳跃 "的数值所困。

这大致上是最初的情况。

//+------------------------------------------------------------------+
//|                                                           01.mq4 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window

#property indicator_buffers 1
#property indicator_color1 Red
#property indicator_width1 1

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+

extern int ExtDepth=12;
extern int ExtDeviation=5;
extern int ExtBackstep=3;
extern int nn=30;

int shift, ww=0;
double zz, SredRazmax=0.0; 
double HZZ[];


int OnInit()
  {
//--- indicator buffers mapping
    SetIndexBuffer(0,HZZ);
  SetIndexStyle(0,DRAW_SECTION);
//---
   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[])
  {
//---
  for(shift = 0; shift <= Bars-1; shift++){
      zz = iCustom(NULL, 0, "ZigZag", ExtDepth, ExtDeviation, ExtBackstep, 0, shift);
           if(zz > 0.0)   {
           HZZ[ww]=zz;
            ww++;          }
           else {
           continue;
           }
    }
//---------------------------------------------+
//расчет среднего значения           
//---------------------------------------------+      
  for(ww=0;ww<=nn;ww++){
       if(HZZ[ww]>HZZ[ww+1]){
          SredRazmax += (HZZ[ww]- HZZ[ww+1]);      
         }     
        else if(HZZ[ww]<HZZ[ww+1]){
         SredRazmax += (HZZ[ww]- HZZ[ww+1])*(-1);
        }
        else{
        continue;
           }
     }  
        
  if(SredRazmax>0){    
   
      Comment("Средний размах = ", SredRazmax/nn,",",HZZ[0],",",HZZ[1],",",HZZ[2],",",HZZ[3],",",HZZ[4]);      
        }
   
       
//--- return value of prev_calculated for next call
 return(0);

  
 
  }
 
Dmitry Belov:

说实话,我只是简化了这个问题(原来的公式看起来有点不同),我想我可以理解为什么平均数的值会跳跃,如果数组中的零值保持不变。我有两个循环,一个用于填充数组,另一个用于计算平均数,有一个nn的限制,实际上我也想输出一个图形--这是一个标准的之字形,但iCustom画得很好,平均...从零节点开始,如果它比前一个节点大,就减去前一个节点,从前一个节点减去前一个节点(它将是减号,所以应该乘以减1),所有这些应该加起来,除以给定的nn节点数。我们得到顶点的平均跨度。进一步说,我想得到 "之 "字形的其他平均数,但我被 "跳跃 "的数值所困。

这大约是它最初的样子。

我不太明白,现在很晚了,我很困,我按照我看到的情况进行了调整,我对指标在零条上的表现有疑问(我没有检查),但它按照你的公式绘制和显示评论

//+------------------------------------------------------------------+
//|                                                           01.mq4 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window

#property indicator_buffers 1
#property indicator_color1 Red
#property indicator_width1 1

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+

extern int ExtDepth=12;
extern int ExtDeviation=5;
extern int ExtBackstep=3;
extern int nn=30;

int  ww=0;
double zz,SredRazmax;
double HZZ[];
bool up,dn;
double lastzz;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,HZZ);
   SetIndexStyle(0,DRAW_SECTION);
   SetIndexEmptyValue(0,0.0);
   up = false;
   dn = false;
   lastzz=0.0;
   SredRazmax=0.0;
//---
   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[])
  {
//---
   int shift,limit;
//--- Первый вызов индикатора или смена таймфрейма или подгрузка данных из истории
   if(prev_calculated==0)
     {
      limit=rates_total-1;
      up = false;
      dn = false;
      lastzz=0.0;
      SredRazmax=0.0;
      ArrayInitialize(HZZ,0.0);
     }
   else limit=rates_total-prev_calculated+1;
   for(shift=limit; shift>=0; shift--)
     {
      zz=iCustom(NULL,0,"ZigZag",ExtDepth,ExtDeviation,ExtBackstep,0,shift);
      if(zz>0.0)
        {
         HZZ[shift]=zz;
         if(lastzz>zz) {up=true;  dn=false;}
         if(lastzz<zz) {up=false; dn=true;}
         if(up) SredRazmax+=zz-lastzz;
         if(dn) SredRazmax+=(zz- lastzz)*(-1);
         lastzz=zz;
        }
      else HZZ[shift]=0.0;
     }
   Comment("Средний размах = ",SredRazmax/nn,",",HZZ[0],",",HZZ[1],",",HZZ[2],",",HZZ[3],",",HZZ[4]);
   return(rates_total);
  }
//+------------------------------------------------------------------+
 

你能帮助我解决这样的问题吗?(如果可能的话。)

专家顾问在某些条件下会发出警报。有没有可能让触发警报的窗口也变得活跃起来?

 
Vatal:

你能帮助我解决这样的问题吗?(如果可能的话。)

专家顾问在某些条件下会发出警报。有没有可能让触发警报的窗口也变得活跃起来?

文档中有一个例子。获取EA运行的图表的ID,然后去...
Примеры работы с графиком - Константы графиков - Константы, перечисления и структуры - Справочник MQL4
Примеры работы с графиком - Константы графиков - Константы, перечисления и структуры - Справочник MQL4
  • docs.mql4.com
В этом разделе представлены примеры для работы со свойствами графика. Для каждого свойства приведены одна или две законченные функции, которые позволяют задавать/получать значение этого свойства. Эти функции можно использовать в своих MQL4 программах как есть. На рисунке показана графическая панель для наглядной демонстрации того, как изменение...
 
Igor Makanu:

我对该指标在零条上的表现有些怀疑(我没有检查),但它确实在绘制并使用你的公式来输出评论。

是的,谢谢你的时间,它工作了,我一定是做错了什么。但它在注释中没有输出数组(应该只有顶点,对吗?),而且减号和数的计算也不对......,之字形的顶点之间有不同的分布。我们的想法是,从最后一个较大的顶点(刚刚形成)中减去前一个较小的顶点,从前一个较小的顶点中甚至减去较大的顶点,这个数字将是带减号的,我们将其乘以(-1),以此类推,所有这些加起来是n次,除以n次,我们得到平均离开。大约在4个手表上,这将是美元指数的1.69(从到)。此外,我想计算顶部之间的平均条数。我现在将尝试理解你的代码,我做错了什么,为什么没有画出来,为什么没有正确计算......

 
Dmitry Belov:
是的,谢谢你的时间,它确实有效,我一定是做错了什么。但它没有输出注释中的数组(它应该只有顶点,对吗?),而且用减法和数法算错了......,人字形的顶点之间有不同的分布。我们的想法是,从最后一个较大的顶点(刚刚形成)中减去前一个较小的顶点,从前一个较小的顶点中甚至减去较大的顶点,这个数字将是带减号的,我们将其乘以(-1),以此类推,所有这些加起来是n次,除以n次,我们得到平均离开。大约在4个手表上,这将是美元指数的1.69(从到)。此外,我想计算顶部之间的平均条数。我现在将尝试理解你的代码,我做错了什么,为什么没有画出来,为什么没有正确计算......

注释中的顶点不会输出,因为指标缓冲区HZZ[]包含复制的指标缓冲区ZigZag的值,否则我们将无法绘制,我特意将顶点检测分成上下两个条件

if(up) SredRazmax+=zz-lastzz;
if(dn) SredRazmax+=(zz- lastzz)*(-1);

如果你需要知道ZZ的几个顶点,那么你必须创建另一个数组来存储这些数据。 新的指标缓冲区将使其复杂化,因为当一个新条形出现时,与指标缓冲区相连的所有数组将与图表一起 "滑动"

ZS:代码是我的例子,我认为它需要循环到第一条,而不是到0,将不断重新计算SredRazmax的值,我现在不能检查,在PC上没有终端。

 
Igor Makanu:

注释中的顶点不会输出,因为指标缓冲区HZZ[]包含复制的指标缓冲区ZigZag的值,否则我们将无法绘制,我特意将顶点检测分成上下两个条件

如果你需要知道ZZ的几个顶点,那么你必须创建另一个数组来存储这些数据。 新的指标缓冲区将使其复杂化,因为所有连接到指标缓冲区的数组都与图表一起 "滑动"。

ZS:这个代码是我的例子,我认为需要循环到第1条,而不是0,会不断重新计算SredRazmax的值,我现在不能检查,在PC上没有终端。

我的指标一经加载就显示出正确的数值,然后每一个刻度都 会增加平均数值,尽管在之字形阵列的输出值中没有变化,但顶点是保持不变。这就是我不能理解的地方,为什么会这样?我缺乏经验和语言知识。我放弃画图--这是iCustum采取的正常的之字形(我现在明白了,它不能在图形上叠加一个数组,所以它画得很糟糕)。阵列会 "爬行",但这样一来,数值就会重新计算,不是吗? 所以我理解 谢谢你......我将努力......学习......。
 
你如何向EA(标准ma)解释,你应该只在均线交叉时买入(卖出),而不是在一般情况下,当ma_1>ma_2时才买入。但它不断地购买,它不能停止
原因: