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

 
Dmitry Belov:

你好,请你告诉我为什么ZigD[0]在某些情况下没有输出?

ZigM[0]是否有效?

 
Alexey Viktorov:

ZigM[0]是否输出?

是的,它是...


	          
 
Dmitry Belov:

是的,它是...

对不起,我没有仔细看代码...

当zz>0时,意味着该值可能等于高栏或低栏。这个值应分别与这些值进行核对,并根据核对结果放在一个或另一个数组中。

 
Alexey Viktorov:

对不起,我没有仔细看代码...

当zzz>0时,意味着该值可以等于高栏或低栏。因此,这个值应该与这些值进行核对,并根据结果放在一个或另一个数组中。

我是这样做的,但不知为什么,它不输出ZigD[],如果我添加ZigD,则完全不输出,如果我把它注释掉,它就会输出所有东西。

//+------------------------------------------------------------------+
//|                                                           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 2
#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, kk=0;
int dd=0;
double zz,SredRazmax, zzz;
double HZZ[], ZigM[];
int ZigD[];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,HZZ);
   SetIndexBuffer(1,ZigM);
   SetIndexStyle(0,DRAW_SECTION);
   SetIndexEmptyValue(0,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;
      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;
        }
     }
     for(ww = 0; ww <= Bars-1; ww++)
  {
      zzz = iCustom(NULL, 0, "ZigZag", ExtDepth, ExtDeviation, ExtBackstep, 0, ww);
      
           if(zzz > 0.0)   
           {
           ZigM[kk]=zzz;
            kk++; 
           ZigD[dd]=ww;
            dd++;  
            }
   }       
   
   // Расчет средних значений 
     for(kk=0;kk<=nn;kk++)
     {
        if(ZigM[kk]>ZigM[kk+1]){SredRazmax+=(ZigM[kk]-ZigM[kk+1]);}
        if(ZigM[kk]<ZigM[kk+1]){SredRazmax+=(ZigM[kk]-ZigM[kk+1])*(-1);}
     if(IsStopped()) 
     break; 
     }
    Comment("Средний размах = ",SredRazmax/nn,",",ZigM[0],",",ZigM[1]);
    Comment(ZigD[0]);
   return(0);
  }
  //+-  
 

大家好!

我找不到一个更合适的 "窗口 "来解决关于MT4的问题。

打开终端时,"状态线"、"标准"、"图表"、"图形仪器"和"图表周期"突然消失。我把它关掉,下次再打开它时,我得到的是空白的终端,只有当前的图表。

我以前从未见过这样的错误,我不知道该怎么做。请告诉我。我不知道该怎么做。

 
Vadens:

大家好!

我找不到一个更合适的 "窗口 "来解决关于MT4的问题。

打开终端时,"状态线"、"标准"、"图表"、"图形仪器"和"图表周期"突然消失。我把它关掉,下次再打开它时,我得到的是空白的终端,只有当前的图表。

我以前从未见过这样的错误,我不知道该怎么做。请告诉我。我不知道该怎么做。

看起来你对终端所在的目录的写入权限有问题。如果你是以受限制的用户身份运行,请将终端移到你可以访问文件/文件夹的目录下。

 
Vadens:

大家好!

我找不到一个更合适的 "窗口 "来解决关于MT4的问题。

打开终端时,"状态线"、"标准"、"图表"、"图形仪器"和"图表周期"突然消失。我把它关掉,下次再打开它时,我得到的是空白的终端,只有当前的图表。

我以前从未见过这样的错误,我不知道该怎么做。请告诉我。我不知道该怎么做。

你有全屏模式(F11)。
 
Dmitry Belov:

我这样做了,但不知为什么,它不输出ZigD[],如果我添加ZigD,它根本不输出,但如果我把它注释掉,它就会输出所有的东西

再一次,我的不注意...

我希望现在会有所不同:)))

评论不眨眼吗?最好是这样写

    Comment("Средний размах = ",SredRazmax/nn,",",ZigM[0],",",ZigM[1],"\n" // Это перенос комментария на следующую строку
           , ZigD[0]);
 
Alexey Viktorov:

再一次,我的注意力不集中...

我希望现在会有所不同:)))

评论不眨眼吗?这样写比较好。

谢谢,我自己已经想明白了,我只需要把数组初始化为双数就可以了。如果你想要的话,这里有指标的代码,但它仍然是原始的,我有更多的想法...告诉我,你知道如何在左下角 或顶部的中间位置显示一个片断吗?

//+------------------------------------------------------------------+
//|                                                           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 3
#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, kk=0;
int dd=0;
double zz,SredRazmax, zzz, SredDlin;
double HZZ[], ZigM[];
double ZigD[];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,HZZ);
   SetIndexBuffer(1,ZigM);
   SetIndexBuffer(2,ZigD);
   SetIndexStyle(0,DRAW_SECTION);
   SetIndexEmptyValue(0,0.0);
   SredRazmax=0.0;
   SredDlin=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;
      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;
        }
     }
     for(ww = 0; ww <= Bars-1; ww++)
  {
      zzz = iCustom(NULL, 0, "ZigZag", ExtDepth, ExtDeviation, ExtBackstep, 0, ww);
      
           if(zzz > 0.0)   
           {
           ZigM[kk]=zzz;
            kk++; 
           ZigD[dd]=ww;
            dd++;  
            }
   }       
   
   // Расчет средних значений 
     for(kk=0;kk<=nn;kk++)
     {
        if(ZigM[kk]>ZigM[kk+1]){SredRazmax+=(ZigM[kk]-ZigM[kk+1]);}
        if(ZigM[kk]<ZigM[kk+1]){SredRazmax+=(ZigM[kk]-ZigM[kk+1])*(-1);}
   //  if(IsStopped()) 
  //   break; 
     }
     for(dd=0;dd<=nn;dd++)
     {
        if(ZigD[dd]>0.0){SredDlin+=(ZigD[dd+1]-ZigD[dd]);}
        if(IsStopped()) 
     break;
     } 
    Comment("Средний размах = ",SredRazmax/nn,"//","Средняя продолжительность = ",SredDlin/nn,"//",ZigM[0],"//",ZigM[1],"//",ZigD[0],"//",ZigD[1]);
    return(0);
  }
  //+-  
Открой новые возможности в MetaTrader 5 с сообществом и сервисами MQL5
Открой новые возможности в MetaTrader 5 с сообществом и сервисами MQL5
  • www.mql5.com
Задавайте вопросы по техническому анализу, обсуждайте торговые системы и улучшайте свои навыки программирования торговых стратегий на языке MQL5. Общайтесь и обменивайтесь опытом на форуме с трейдерами всего мира и помогайте ответами новичкам — наше сообщество развивается вместе с вами. Машинное обучение в трейдинге: теория и практика...
 
Dmitry Belov:

谢谢,我自己也能弄明白,我只需要把数组初始化为双数,一切都能成功。如果你想的话,这里有指标代码,但它仍然是原始的,有更多的想法...告诉我,你知道如何在左下角 或顶部的中间位置显示片段吗?

这是不可能的。只有当你使用图形对象OBJ_LABEL时才会如此。