Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 370

 
PokrovMT5:

Bonjour, Pouvez-vous s'il vous plaît me dire si vous avez besoin de taper dans iData pour cet indicateur, peu importe si c'est un programme ou une référence aux données de la barre, où vous pouvez spécifier le timeframe, pourquoi les données des autres timeframes ne sont pas reflétées correctement dans le courant différent sur le graphique timeframe, mais seulement dans le graphique du timeframe spécifié ? Merci.


Je ne comprends pas bien.

Mais je pense que cela va aider

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

Merci pour le lien, j'ai exactement la même image, seulement un algorithme légèrement différent, le but est de faire plus de points (dans le dessin final), les faire apparaître avec un seuil.

 
Alekseu Fedotov:

Je ne comprends pas bien.

Mais je pense que ça aide.


Merci, je vais me pencher sur la question, mais à titre d'exemple le principe pourquoi cela ne fonctionne-t-il pas si au lieu d'écrire les données d'un autre timeframe au lieu de zéro, pourquoi cela ne se reflète pas correctement, dois-je d'abord les copier et ensuite les dessiner ?

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

Découvrez-le ici.


Novaja:

Merci pour le lien, j'ai exactement la même image, seulement un algorithme légèrement différent, l'essentiel est de faire plus de points (dans le dessin final), pour les faire apparaître avec un seuil.


Vous pouvez le faire, mais il s'avère que Renco, c'est-à-dire divise en segments égaux la distance m / un sommet. Cela casse l'algorithme lui-même de recherche de sommets, la question est de savoir comment faire tout en maintenant le code initial, le seuil entre les points (sur le dessin en plus), devrait obtenir un multiple de la distance entre tous sauf le dernier et le sommet (sera inférieur au seuil).

 
//+------------------------------------------------------------------+
//|                                                       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);
}
//+------------------------------------------------------------------+
 

Pour une raison quelconque, le code n'insérait pas le commentaire immédiatement, j'ai dû le réécrire.

 
PokrovMT5:

Merci, je vais me pencher sur la question, mais à titre d'exemple, pourquoi cela ne fonctionne-t-il pas si, au lieu d'écrire zéro, vous mettez des données d'un autre timeframe, pourquoi cela ne se reflète-t-il pas correctement, dois-je d'abord les copier et ensuite les dessiner ?



CopyClose est une fonction plus moderne, mais ok,iClose(...) fonctionne bien.

Une image ou un morceau de code, s'il vous plaît, soyez plus précis.

 
Alekseu Fedotov:

CopyClose est une fonction plus moderne, mais bon, iClose(...) fonctionne bien.

Une image ou un morceau de code, s'il vous plaît, soyez plus précis.

Eh bien, voici un exemple simple, je veux voir les prix de clôture sur le graphique, je veux voir une heure sur l'échelle de temps, tout est bon sur l'horloge, mais c'est différent sur toute autre échelle de temps. L'idée était de voir les prix de clôture des plus élevés sur une plus petite échelle de temps. L'image est de 30 minutes.
//+------------------------------------------------------------------+
//|                                                   Проверка 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:
Eh bien voici l'exemple le plus simple, je veux voir les prix de clôture sur le graphique, l'échelle de temps est écrite une heure, tout est bon sur l'horloge, tout est différent sur toute autre échelle de temps. L'idée était de voir les prix de clôture des plus élevés sur une plus petite échelle de temps. L'image est de 30 minutes.

Comme ceci


     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:

C'est comme ça.



Merci beaucoup !

Raison: