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

 
PokrovMT5:

你好,请你告诉我,如果你需要为这个指标输入iData,不管是任何程序还是对条形数据的引用,在你可以指定时间段的地方,为什么其他时间段的数据不能正确反映在当前不同时间段的图表上,而只能反映在指定时间段的图表上?谢谢你。


我不太明白

我认为这将有助于

Доступ к таймсериям и индикаторам - Справочник MQL4
Доступ к таймсериям и индикаторам - Справочник MQL4
  • docs.mql4.com
Функции для работы с таймсериями и индикаторами. Таймсерия отличается от обычного массива тем, что индексация элементов таймсерии производится от конца массива к началу (от самых свежих данных к самым старым). Для копирования значений таймсерий и индикаторов рекомендуется использовать только динамические массивы, так как функции копирования...
 

谢谢你的链接,我有完全相同的图片,只是算法略有不同,重点是让更多的点(在最后的图纸中),让它们出现一个阈值。

 
Alekseu Fedotov:

我不太明白。

我认为这有帮助


谢谢你,我会研究它,但作为一个例子,为什么它不工作,而不是写另一个时间框架的数据,而不是零,为什么它不能正确反映,我应该先复制它,然后绘制它?

iClose(NULL,0,i);
 
Alekseu Fedotov:

请看这里。


Novaja:

谢谢你的链接,我有完全相同的图片,只是算法略有不同,其实质是要多做一些点(在最后的绘图中),使它们出现一个阈值。


你可以这样做,但它变成了Renco,即分为相等的段距离m /一个顶点。这打破了算法本身的搜索顶点,问题是如何在保持初始代码的同时,使点与点之间的阈值(在另外的画法上),应该得到除最后一个和最上面的所有距离的倍数(将小于阈值)。

 
//+------------------------------------------------------------------+
//|                                                       FastZZ.mq4 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, Yurich"
#property link      "https://login.mql5.com/ru/users/Yurich"
//---
#property indicator_chart_window
#property indicator_buffers 4
#property indicator_color1 Red
#property indicator_color2 Red
#property indicator_color3 Gold
#property indicator_color4 DodgerBlue

#property indicator_width3 3
#property indicator_width4 3

//--- input parameters
extern int  Depth    = 10;
//---
double zzH[], zzL[];
double depth;
int last, direction, pbars;
datetime lastbar;

double ArrUp[];
double ArrDn[];
//+------------------------------------------------------------------+
int init()
{
//---- indicators
   SetIndexBuffer(0,zzH);
   SetIndexBuffer(1,zzL);
   SetIndexBuffer(2,ArrUp);
   SetIndexBuffer(3,ArrDn);
   
   SetIndexStyle(0,DRAW_ZIGZAG);
   SetIndexStyle(1,DRAW_ZIGZAG);
   SetIndexStyle(2,DRAW_ARROW);
   SetIndexStyle(3,DRAW_ARROW);
   
   SetIndexArrow(2,159);
   SetIndexArrow(3,159);
   
   SetIndexEmptyValue(0,0.0);
   SetIndexEmptyValue(1,0.0);
   IndicatorDigits(Digits);
//----
   depth=Depth*Point;
   direction=1;
   last=0;
   pbars=0;
   lastbar=0;
   return(0);
}
//+------------------------------------------------------------------+
int start()
{
   int limit=Bars-IndicatorCounted()-1;
   if(lastbar!=Time[0])
   {
      lastbar=Time[0];
      last++;
   }
   if(MathAbs(Bars-pbars)>1) { last=Bars-1; limit=last;}
   pbars=Bars;
   //---
   for(int i=limit; i>0; i--)
   {
      bool set=false;
      zzL[i]=0;
      zzH[i]=0;
      ArrUp[i]=EMPTY_VALUE;
      ArrDn[i]=EMPTY_VALUE;
      //---
      if(direction>0)
      { 
         if(High[i]>zzH[last]+depth)
         {
            zzH[last]=0;
            zzH[i]=High[i];
           
            ArrUp[i]=High[i];
            
            if(Low[i]<High[last]-depth)
            {
               if(Open[i]<Close[i])
                {
                  zzH[last]=High[last]; 
                  ArrUp[last]=High[last];
                }else direction=-1;
               zzL[i]=Low[i];
               ArrDn[i]=Low[i];
            }
            last=i;
            set=true;
         }
         if(Low[i]<zzH[last]-depth && (!set || Open[i]>Close[i]))
         {
            zzL[i]=Low[i];
            ArrDn[i]=Low[i];
            
            if(High[i]>zzL[i]+depth && Open[i]<Close[i])
             {
               zzH[i]=High[i];
               ArrUp[i]=High[i]; 
             }else direction=-1;
            last=i;
         }
      } else //direction<0
      {
         if(Low[i]<zzL[last]-depth)
         {
            zzL[last]=0;
            zzL[i]=Low[i];
        
            ArrDn[i]=Low[i];            
            
            if(High[i]>Low[last]+depth)
            {
               if(Open[i]>Close[i])
                {
                  zzL[last]=Low[last]; 
                  ArrDn[last]=Low[last];
                }else direction=1;
               zzH[i]=High[i];
               ArrUp[i]=High[i];
            }
            last=i;
            set=true;
         }
         if(High[i]>zzL[last]+depth && (!set || Open[i]<Close[i]))
         {
            zzH[i]=High[i];
            ArrUp[i]=High[i];
            
            if(Low[i]<zzH[i]-depth && Open[i]>Close[i])
             {
               zzL[i]=Low[i]; 
               ArrDn[i]=Low[i];
             }else direction=1;
            last=i;
         }
      }
   }
//----
   zzH[0]=0;
   zzL[0]=0;
//----
   return(0);
}
//+------------------------------------------------------------------+
 

由于某些原因,代码没有立即插入注释,我不得不重写它。

 
PokrovMT5:

谢谢你,我会研究的,但作为一个例子,如果你不写零,而是放进另一个时间段的数据,为什么不能正确反映,我应该先复制,然后再画出来吗?



CopyClose是一个更现代的函数,但是OKiClose(...)可以正常工作。

它是如何不能正常工作的? 一张图片或一段代码,请更具体一些。

 
Alekseu Fedotov:

CopyClose是一个更现代的函数,但还好,iClose(...)也能正常使用

它是如何错误地工作的? 一张图片或一段代码,请更精确。

好吧,这里有一个简单的例子,我想在图表上看到收盘价,我想在时间框架上看到一小时,在时钟上一切都很好,但在任何其他时间框架上都不同。我们的想法是在一个较小的时间框架内看到较高的收盘价。图片为30分钟。
//+------------------------------------------------------------------+
//|                                                   Проверка 2.mq4 |
//|                                                  Bugaev Vladimir |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Bugaev Vladimir"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 clrBlue
#property indicator_width1 2
int i,limit;

double C,CC[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
IndicatorBuffers(1);
//----      
   SetIndexBuffer(0,CC);
  
   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(prev_calculated<1) limit=rates_total-1;
if(prev_calculated>0)limit=rates_total-prev_calculated;
for(i=limit; i>0; i--)  
  
  {
 C= iClose(NULL,60,i);
 CC[i]=C; 



  }
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
PokrovMT5:
那么这里有一个最简单的例子,我想在图表上看到收盘价,时间框架写的是一小时,在时钟上一切都很好,在任何其他时间框架上都是不同的。我们的想法是在一个较小的时间框架内看到较高的收盘价。图片为30分钟。

像这样


     int shift;
     datetime  T;
  
   for(i=limit; i>=0; i--)
     {
      T = iTime(NULL,0,i); 
      shift=iBarShift(NULL,60,T); 
      C=iClose(NULL,60,shift);
      CC[i]=C;
     }
 
Alekseu Fedotov:

事情就是这样的。



非常感谢您!

原因: